随着Pandas 0.20.1的发布,对于groupby.agg()的功能有了新的弃用,并带有用于重命名的字典。
我正在尝试找到更新代码的最佳方法来解决这个问题,但是我正在努力解决我目前如何利用这种重命名功能。
当我进行聚合时,我经常为每个源列提供多个函数,并且我一直在使用此重命名功能来获取具有这些新列名的单个级别索引。
示例:
df = pd.DataFrame({'A': [1, 1, 1, 2, 2],'B': range(5),'C': range(5)})
In [30]: df
Out[30]:
A B C
0 1 0 0
1 1 1 1
2 1 2 2
3 2 3 3
4 2 4 4
frame = df.groupby('A').agg({'B' : {'foo':'sum'}, 'C': {'bar' : 'min', 'bar2': 'max'}})
结果是:
Out[33]:
B C
foo bar bar2
A
1 3 0 2
2 7 3 4
我通常会这样做:
frame = pd.DataFrame(frame).reset_index(col_level=1)
frame.columns = frame.columns.get_level_values(1)
frame
Out[42]:
A foo bar bar2
0 1 3 0 2
1 2 7 3 4
所以我正在寻找获得单级索引的结果数据框的好方法,但是有新的唯一列名。多列源自单个源列的聚合。非常感谢任何最佳方法的建议。
答案 0 :(得分:5)
这在0.20.1
版本中完美无缺:
d = {'sum':'foo','min':'bar','max':'bar2'}
frame = df.groupby('A').agg({'B' : ['sum'], 'C': ['min', 'max']}).rename(columns=d)
frame.columns = frame.columns.droplevel(0)
frame = frame.reset_index()
print (frame)
A foo bar bar2
0 1 3 0 2
1 2 7 3 4
如果多个min
s:
d = {'B_sum':'foo','C_min':'bar','C_max':'bar2'}
frame = df.groupby('A').agg({'B' : ['sum'], 'C': ['min', 'max']})
frame.columns = frame.columns.map('_'.join)
frame = frame.reset_index().rename(columns=d)
print (frame)
A foo bar bar2
0 1 3 0 2
1 2 7 3 4
答案 1 :(得分:3)
这是更短的选择:
In [78]: d={'C_min':'min_C', 'C_sum':'sum_C','B_min':'min_B','B_sum':'sum_B'}
In [79]: frame
Out[79]:
C B
min sum min sum
A
1 0 3 0 3
2 3 7 3 7
In [80]: frame.columns = frame.columns.map('_'.join).to_series().map(d)
In [81]: frame
Out[81]:
min_C sum_C min_B sum_B
A
1 0 3 0 3
2 3 7 3 7
答案 2 :(得分:0)
您可以在列上调用droplevel
,然后reset_index
:
In [46]:
frame.columns = frame.columns.droplevel(0)
frame = frame.reset_index()
frame
Out[46]:
A bar bar2 foo
0 1 0 2 3
1 2 3 4 7