在一列中具有列名称的熊猫数据框中的聚合

时间:2020-05-28 10:25:11

标签: python pandas dataframe aggregate-functions

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

1 个答案:

答案 0 :(得分:2)

为避免使用此问题,named aggregations在熊猫 0.25 + 中使用,可以在其中指定每列的名称:

import pandas as pd
MSCI = pd.read_csv("/Users/user/data/MSCI Wolrd returns.csv", header=0, index_col=0, parse_dates=True,sep=";")

MSCI.head()

对于较低的熊猫版本,可以在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