为了账号安全,请及时绑定邮箱和手机立即绑定

python pandas数据框groupby或pivot_table

python pandas数据框groupby或pivot_table

莫回无 2021-12-09 18:20:28
例子:import pandas as pddata = {'id':[101,101,101,101,102,102,102,102],    'day':[1,2,1,2,1,2,1,2],    'year':[2011,2011,2012,2012,2011,2011,2012,2012],    'avg':[0.500,0.400,0.300,0.200,0.555,0.455,0.355,0.255],    'sum':[1, 2, 2, 3, 6, 6, 8, 9],    'div':[2, 1, 3, 2, 6, 1, 6, 3]}df = pd.DataFrame(data)df    id  day year    avg     sum div0   101 1   2011    0.500   1   21   101 2   2011    0.400   2   12   101 1   2012    0.300   2   33   101 2   2012    0.200   3   24   102 1   2011    0.555   6   65   102 2   2011    0.455   6   16   102 1   2012    0.355   8   67   102 2   2012    0.255   9   3所需的输出:    id  sum div 2011_avg    2012_avg    2011_sum    2012_sum    2011_div    2012_div0   101 8   8   0.450       0.250       3           5           2           1.51   102 29  16  0.505       0.305       12          17          6           2.0我按年份为每一列制作了几个 pivot_tables 并多次加入..谁能给我一些知识,让我更容易或有效地获得所需的输出?
查看完整描述

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]


查看完整回答
反对 回复 2021-12-09
?
大话西游666

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")


查看完整回答
反对 回复 2021-12-09
  • 2 回答
  • 0 关注
  • 181 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信