如何通过pandas中的列创建聚合?

时间:2016-03-29 10:37:15

标签: python pandas

我试过阅读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)})

我想要一个包含两行foobar的新数据框,其中一列中的总和值为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?

1 个答案:

答案 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