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

问题描述 投票:1回答:1

我使用以下代码基于列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

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

python-3.x pandas pandas-groupby
1个回答
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)
© www.soinside.com 2019 - 2024. All rights reserved.