对pandas数据帧进行透视表操作

时间:2016-01-05 18:25:49

标签: python pandas

我有这个人。 pandas中的数据框:

df

DAY   YEAR    REGION   VALUE
  1   2000     A         12
  2   2000     A         10
  3   2000     A         13
  6   2000     A         15
  1   2001     A         3
  2   2001     A         40
  3   2001     A         83
  4   2001     A         95
  1   2000     B         124
  3   2000     B         102
  5   2000     B         131
  8   2000     B         150
  1   2001     B         30
  5   2001     B         4
  8   2001     B         8
  9   2001     B         12

我想创建一个新的数据框,使每行包含YEAR和REGION的不同组合。它还包含一个列,该列总结了该YEAR,REGION组合的VALUE和另一个为YEAR,REGION组合提供最大值的列。结果应如下所示:

YEAR    REGION  SUM_VALUE   MAX_VALUE
2000    A       50          15
2001    A       221         95
2000    B       507         150
2001    B       54          30

这是我正在做的事情:

new_df = pandas.DataFrame()

for yr in df.YEAR.unique():
    for reg in df.REGION.unique():
            new_df = new_df.append({'YEAR': yr}, ignore_index=True)
            new_df = new_df.append({'REGION: reg}, ignore_index=True)

但是,这会每次创建一个新行,并且由于xtra for循环而不是非常pythonic。还有更好的方法吗?

请注意,这是一个玩具数据框,实际数据框有几个VALUE列。建议的解决方案应该扩展,而不必手动指定VALUE列的名称。

1 个答案:

答案 0 :(得分:2)

在'YEAR'和'REGION'上

groupby并传递一个func列表,使用agg进行调用:

In [9]:
df.groupby(['YEAR','REGION'])['VALUE'].agg(['sum','max']).reset_index()

Out[9]:
   YEAR REGION  sum  max
0  2000      A   50   15
1  2000      B  507  150
2  2001      A  221   95
3  2001      B   54   30

修改

如果要命名聚合列,请传递一个词典:

In [18]:
df.groupby(['YEAR','REGION'])['VALUE'].agg({'sum_VALUE':'sum','max_VALUE':'max'}).reset_index()

Out[18]:
   YEAR REGION  max_VALUE  sum_VALUE
0  2000      A         15         50
1  2000      B        150        507
2  2001      A         95        221
3  2001      B         30         54