我正在使用Python 3.6
,并且正在做一个汇总,我已经正确完成了,但是列名不是我想要的形式。
df = pd.DataFrame({'ID':[1,1,2,2,2],
'revenue':[1,3,5,1,5],
'month':['2012-01-01','2012-01-01','2012-03-01','2014-01-01','2012-01-01']})
print(df)
ID month revenue
0 1 2012-01-01 1
1 1 2012-01-01 3
2 2 2012-03-01 5
3 2 2014-01-01 1
4 2 2012-01-01 5
进行下面的汇总。
df = df.groupby(['ID']).agg({'revenue':'sum','month':[('distinct_m','nunique'),('month_m','first')]}).reset_index()
print(df)
ID revenue month
sum distinct_m month_m
0 1 4 1 2012-01-01
1 2 11 3 2012-03-01
所需的输出是:
ID revenue distinct_m month
0 1 4 1 2012-01-01
1 2 11 3 2012-03-01
问题是我在agg()
中使用了混合形式的表达式。如果只有agg('revenue':'sum')
,我将得到一个与我想要的格式完全相同的名为revenue
的列,如下所示:
ID revenue
0 1 4
1 2 11
但是,由于我还要使用tuple
形式('distinct_m','nunique'),('month_m','first')
创建2个额外的列,所以我得到的列名分布在两行中。
是否有一种方法可以通过聚合agg()
获得上面所示的所需输出?我想避免对'revenue':'sum'
使用元组形式。之后,我没有在寻找多个操作来使列名正确。我正在使用Python 3.6
。
为避免使用此问题,在熊猫0.25 +中使用named aggregations,可以在其中指定各列的名称:
df = (df.groupby(['ID']).agg(revenue=('revenue','sum'),
distinct_m=('month','nunique'),
month_m = ('month','first')
).reset_index())
print(df)
ID revenue distinct_m month_m
0 1 4 1 2012-01-01
1 2 11 3 2012-03-01
对于较低的熊猫版本,可以将MultiIndex
中的列扁平化,然后将rename
中的列扁平化:
df = df.groupby(['ID']).agg({'revenue':'sum',
'month':[('distinct_m','nunique'),('month_m','first')]})
df.columns = df.columns.map('_'.join)
df = df.rename(columns={'revenue_sum':'revenue',
'month_distinct_m':'distinct_m',
'month_month_m':'month_m'})
df = df.reset_index()
print(df)
ID revenue distinct_m month_m
0 1 4 1 2012-01-01
1 2 11 3 2012-03-01