如何对 groupby 进行矢量化并应用于 pandas?
How to vectorize groupby and apply in pandas?
我正在尝试基于组在数据框的几列上计算 (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
不确定性能,但在这里您可以使用 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)
我正在尝试基于组在数据框的几列上计算 (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
不确定性能,但在这里您可以使用 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)