我有这个人。 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列的名称。
答案 0 :(得分:2)
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