我正在使用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 :(得分: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