熊猫数据框中的聚合,其中列名称位于一行中

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

我正在使用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

python pandas dataframe aggregate-functions
1个回答
1
投票

为避免使用此问题,在熊猫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
© www.soinside.com 2019 - 2024. All rights reserved.