Pandas:创建多个聚合列并以优雅的方式合并多个数据帧

时间:2018-03-02 20:36:55

标签: python-3.x pandas pandas-groupby

我使用以下代码根据列version创建一些新的聚合列。然后合并4个新数据帧。

new_df = df[['version','duration']].groupby('version').mean().rename(columns=lambda x: ('mean_' + x)).reset_index().fillna(0)

new_df1 = df[['version','duration']].groupby('version').std().rename(columns=lambda x: ('std_' + x)).reset_index().fillna(0)
new_df2 = df[['version','ts']].groupby('version').min().rename(columns=lambda x: ('min_' + x)).reset_index().fillna(0)
new_df3 = df[['version','ts']].groupby('version').max().rename(columns=lambda x: ('max_' + x)).reset_index().fillna(0)

new_df3

import pandas
df_a = pandas.merge(new_df,new_df1, on = 'version')
df_b = pandas.merge(df_a,new_df2, on = 'version')
df_c = pandas.merge(df_b,new_df3, on = 'version')
df_c

输出如下所示:

    version  mean_duration  std_duration    min_ts                max_ts
0   1400422  451                1               2018-02-28 09:42:15   2018-02-28 09:42:15
1   7626065  426                601             2018-01-25 11:01:58   2018-01-25 11:15:22
2   7689209  658                473             2018-01-30 11:09:31   2018-02-01 05:19:23
3   7702304  711                80              2018-01-30 17:49:18   2018-01-31 12:27:20

代码工作正常,但我想知道是否有更优雅/干净的方式来做到这一点?谢谢!

1 个答案:

答案 0 :(得分:1)

使用functools reduce修改结果(merge

import functools
l=[new_df1,new_df3,new_df3]
functools.reduce(lambda left,right: pd.merge(left,right,on=['version']), l)

或者让我们使用agg重新创建您需要的内容

s=df.groupby('version').agg({'duration':['mean','std'],'ts':['min','max']}).reset_index()

s.columns=s.columns.map('_'.join)