在数据帧切片上按列值查找计算函数的最快方法(Python pandas)

2024-05-13 03:41:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在一个数据帧上创建一个列,该列包含a列(值列)的最小值,而B列(id列)具有特定值。我的代码很慢。我在找一个更快的方法。以下是我的小功能:

def apply_by_id_value(df, id_col="id_col", val_col="val_col", offset_col="offset", f=min):
    for rid in set(df[id_col].values):
        df.loc[df[id_col] == rid, offset_col] =  f(df[df[id_col] == rid][val_col])
    return df

示例和用法:

^{pr2}$

更多的上下文:在我的实际数据中,“id_col”列有大约30000个或更多的唯一值。这意味着数据帧必须被切片30000次。我想这就是瓶颈。在


Tags: 数据方法代码功能iddfbyvalue
1条回答
网友
1楼 · 发布于 2024-05-13 03:41:54

对'id_col'执行^{},然后执行^{}传递函数'min',这将返回一个与原始df对齐的序列,以便您可以添加为新列:

In [13]:

df = pd.DataFrame({"id_col":[0, 0, 0, 1, 1, 1, 2, 2, 2], 
                   "val_col":[0.1, 0.2, 0.3, 0.6, 0.4, 0.5, 0.2, 0.1, 0.0]})
df['offset'] = df.groupby('id_col').transform('min')
df
Out[13]:
   id_col  val_col  offset
0       0      0.1     0.1
1       0      0.2     0.1
2       0      0.3     0.1
3       1      0.6     0.4
4       1      0.4     0.4
5       1      0.5     0.4
6       2      0.2     0.0
7       2      0.1     0.0
8       2      0.0     0.0

计时

^{pr2}$

因此,groupby和{}在这个数据集上更快,我希望它在实际数据集中更快,因为它可以更好地扩展。在

对于800000行数据流,我得到以下时间安排:

1 loops, best of 3: 611 ms per loop
1 loops, best of 3: 438 ms per loop

相关问题 更多 >