簡體   English   中英

如何加快pandas申請?

[英]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列,然后按groupbygroup_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM