我试过阅读pandas groupby documentation,但我无法遵循它(我需要更多示例)。我有以下数据框:
df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
'foo', 'bar', 'foo', 'foo'],
'B' : ['one', 'one', 'two', 'three',
'two', 'two', 'one', 'three'],
'C' : np.random.randn(8),
'D' : np.random.randn(8)})
我想要一个包含两行foo
和bar
的新数据框,其中一列中的总和值为C,另一列中的总和值为C/D
。像这样,例如:
A C C_over_D
'foo' 1.2 3.4
'bar' 2.3 5.4
我可以像这样得到C的总和值:
df = df.groupby('A')['C'].sum()
虽然这给了我一个没有C:
列名的数据对象A
bar -0.821788
foo -6.006086
但是如何将其扩展为(a)返回一个带有C *(b)列的正确数据帧,将C的值返回到D?
答案 0 :(得分:1)
对于您应该创建的专栏C
和专栏C/D
,您需要aggregation的IIUC:
np.random.seed(632)
df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
'foo', 'bar', 'foo', 'foo'],
'B' : ['one', 'one', 'two', 'three',
'two', 'two', 'one', 'three'],
'C' : np.random.randn(8),
'D' : np.random.randn(8)})
df['C/D'] = df['C'] / df['D']
In [293]: df.groupby('A')['C', 'C/D'].agg(sum)
Out[293]:
C C/D
A
bar 0.060808 -8.173028
foo -1.461735 -0.058941
对于平面数据框,您还可以使用reset_index
:
In [294]: df.groupby('A')['C', 'C/D'].agg(sum).reset_index()
Out[294]:
A C C/D
0 bar 0.060808 -8.173028
1 foo -1.461735 -0.058941