【问题标题】:How to vectorize groupby and apply in pandas?如何矢量化 groupby 并在 pandas 中应用?
【发布时间】:2021-02-10 14:05:10
【问题描述】:

我正在尝试根据组在数据帧的几列上计算 (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))

根据我的 groupby 经验,apply 和 join 对于大型数据帧效率不高,所以我想找到一种方法来替换 groupby 和 apply 函数。
有谁知道 vectrozing 这个过程的更好方法,而不是使用 groupby 和 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

【问题讨论】:

    标签: python pandas group-by vectorization apply


    【解决方案1】:

    不确定性能,但在这里你可以使用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)
    

    【讨论】:

    • 感谢您的回复,性能也很好。
    猜你喜欢
    • 2021-01-18
    • 2014-11-29
    • 2020-08-02
    • 2020-07-23
    • 1970-01-01
    • 2021-11-10
    • 2023-03-20
    • 2019-12-21
    • 2020-11-19
    相关资源
    最近更新 更多