如何对groupby进行矢量化处理并在熊猫中应用?

时间:2020-10-28 08:21:40

标签: python pandas group-by vectorization apply

我正在尝试基于组在数据帧的几列上计算(x-x.mean())/(x.std +0.01)。 我原来的数据帧很大。尽管我已将原始文件分成几个块,并使用多重处理在文件的每个块上运行脚本,但仍然数据帧的每个块都非常大,并且此过程从未完成。

我使用了以下代码:

df[val_cols] = df.groupby(['user_id', 'category', 'date'])[val_cols].apply(lambda x: (x - x.mean()) / (x.std() + 0.01))

根据我的分组经验,对于大型数据框,apply和join效率不高,因此我想找到一种替代groupby和apply函数的方法。
有谁知道使用 vectrozing 更好的方法,而不是使用groupby and apply? 我也不在寻找诸如pandarallel,swifter或dask之类的多处理库,因为我已经尝试过了,但是它们并没有帮助我。

样本df:

df = pd.DataFrame(columns=['user_id', 'category', 'date', 'item_id', 'value_1_diff', 'value_2_diff', 'value_3_diff'], data=[[4,8,'10/5/2019', 'hi', 5, 13, 21], [5,10,'1/12/2019', 'fine', 6, 15, 11], [4,8,'10/5/2019', 'hello', 5, 13, 3], [5,10,'1/12/2019', 'hi', 7, 8, 9], [3,8,'10/5/2019', 'ok', 5,7, 13]])

         user_id   category   date         item_id    value_1_diff   value_2_diff   value_3_diff
0        4         8          10/5/2019    hi          5             13             21
1        5         10         1/12/2019    fine        6             15             11
2        4         8          10/5/2019    hello       5             13             3
3        5         10         1/12/2019    hi          7             8              9
4        3         8          10/5/2019    ok          5             7              13

1 个答案:

答案 0 :(得分:0)

不确定性能,但是您可以在这里使用GroupBy.transform

val_cols = ['value_1_diff', 'value_2_diff', 'value_3_diff']

g = df.groupby(['user_id', 'category', 'date'])[val_cols]
df[val_cols] = df[val_cols].sub(g.transform('min')).div(g.transform('std') + 0.01)