pandas DataFrame:有效地计算组中所有行的 f(row1, row2) 最小值

问题描述

我可以使用列表推导以简单的方式在 Pandas DataFrame 中找到 f(row1,row2) 的最小值,其中 f 是返回具有比较值的任意函数:

import pandas as pd

df = pd.DataFrame({"g": [0,1,1],"x": [0,2,3,4]})


def f(row1,row2):
    return (row1["x"],row2["x"])


def getmin(df):
    df["f"] = [
        df.drop(index=index2).apply(f,args=[row2],axis=1).min()
        for index2,row2 in df.iterrows()
    ]
    return df

所以 df

   g  x
0  0  0
1  0  1
2  1  2
3  1  3
4  1  4

getmin(df)返回

   g  x       f
0  0  0  (0,1)
1  0  1  (1,0)
2  1  2  (2,0)
3  1  3  (3,0)
4  1  4  (4,0)

我可以以同样简单的方式获得每个组 "g" 中的最小值:df.groupby("g").apply(getmin) 返回

   g  x       f
0  0  0  (0,3)
3  1  3  (3,2)
4  1  4  (4,2)

问题

是否有更有效(例如,向量化或 cythonized)的方法来定义 getmin 而不是使用列表理解?

也欢迎使用 f 的参数顺序无关紧要的解决方案(即 f(row1,row2) = f(row2,row1),例如 f = lambda row1,row2: sorted((row1["x"],row2["x"])))。

请注意,上面 getmin 的定义等效于,但比更透明的定义更有效:

def getmin(df):
    minima = []
    for index1,row1 in df.iterrows():
        minimum = None
        for index2,row2 in df.iterrows():
            if index1 == index2:
                continue
            val = f(row1,row2)
            if minimum is None or val < minimum:
                minimum = val
        minima.append(minimum)
    df["f"] = minima
    return df

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)