2 回答
TA贡献1900条经验 获得超5个赞
您可能需要groupby两次,然后join返回结果
s=df.groupby(['id','year']).agg({'avg':'mean','sum':'sum','div':lambda x : x.iloc[0]/x.iloc[1]})
s=s.unstack()# here is reshape
s.columns=s.columns.map('{0[1]}_{0[0]}'.format) # here is flatten the multiple index
s
Out[723]:
2011_avg 2012_avg 2011_sum 2012_sum 2011_div 2012_div
id
101 0.450 0.250 3 5 2.0 1.5
102 0.505 0.305 12 17 6.0 2.0
s2=df.groupby(['id']).agg({'sum':'sum','div':lambda x : x.iloc[0]/x.iloc[1]})
Finaldf=s2.join(s)# join back
Finaldf
Out[729]:
sum div 2011_avg ... 2012_sum 2011_div 2012_div
id ...
101 8 2 0.450 ... 5 2.0 1.5
102 29 6 0.505 ... 17 6.0 2.0
[2 rows x 8 columns]
TA贡献1817条经验 获得超14个赞
我尝试只做 2 个 groupbys,然后合并两个结果。只是为了命名约定,我使用了pivot_table。
df2 = df.groupby(by=["id","year"]).agg({
"avg": np.median,
"sum": np.sum,
"div": lambda x : x.iloc[0]/x.iloc[1]
}).reset_index().pivot_table(values=["avg","sum","div"],columns=["year"],index=["id"]).reset_index()
df2.columns = [str(col[1])+"_"+col[0] if col[1] != "" else col[0] for col in df2.columns.values ]
df2.merge(df.groupby(by=["id"]).agg({
"avg": np.median,
"div": lambda x : x.iloc[0]/x.iloc[1],
"sum": np.sum
}), on="id")
添加回答
举报