[英]How to speed up pandas apply?
我有 314 萬行的大 DataFrame,我需要使用 1 列對它們進行分組,然后按組計算標准差和均值。 我已經完成了以下操作並且它按預期工作,但它非常慢(僅 20000 行就需要 1 分鍾以上)。 我很確定有更快的方法,但是當我嘗試用谷歌搜索時我找不到任何方法。
def gen_time_feats(df):
feats = df.loc[:, 'f_0':'f_299']
for col in feats.columns:
df[f'{col}_avg'] = np.mean(feats[col].values)
df[f'{col}_std'] = np.std(feats[col].values)
return df
df_grouped = df.groupby('group_id')
df_with_time_feat = df_grouped.apply(gen_time_feats)
DataFrame 有 300 列,我想將 append 的標准偏差和平均值作為附加列,所以最后它會變成 900 列。
由於您在每列上應用相同的兩個函數,您可以使用
groupby<\/code> +
agg<\/code>並將字典傳遞給
agg<\/code>指定函數。
然后,展平 MultiIndex 列名稱。
df_with_time_feat = df.groupby('group_id').agg({col: [np.mean, np.std] for col in df.columns.drop('group_id')})
df_with_time_feat.columns = map('_'.join, df_with_time_feat.columns)
使用filter
選擇f_xxx
列,然后按groupby
列group_id
,然后使用函數列表應用於每列。 最后,扁平化你的列索引。
out = df.filter(regex='f_\d+').groupby(df['group_id']).agg(['mean', 'std'])
out.columns = out.columns.to_flat_index().str.join('_')
out = df.set_index('group_id').join(out).sort_index(axis=1).reset_index()
print(out)
# Output:
group_id f_100 f_100_mean f_100_std f_200 f_200_mean f_200_std
0 A 1 3.0 2.828427 5 7.0 2.828427
1 A 5 3.0 2.828427 9 7.0 2.828427
2 B 2 3.0 1.414214 6 7.0 1.414214
3 B 4 3.0 1.414214 8 7.0 1.414214
設置:
df = pd.DataFrame({'group_id': list('ABBA'), 'f_100': [1, 2, 4, 5], 'f_200': [5, 6, 8, 9]})
print(df)
# Output
group_id f_100 f_200
0 A 1 5
1 B 2 6
2 B 4 8
3 A 5 9
請注意,如果您想使用名稱 '_avg' 而不是 '_mean',請使用agg
的修改版本: .agg([('avg', 'mean'), 'std'])
我認為這是最簡單的。 在我的 PC 上,一個 314 萬行的表大約需要 16 秒。
desc = pd.merge(df.groupby("group_id").mean(),
df.groupby("group_id").std(ddof=0),
suffixes=("_avg", "_std"), left_index=True, right_index=True)
# print(desc) # This table contains mean and std for each group.
result = df.merge(desc.reset_index(), on='group_id')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.