Pandas groupby在变换前后进行索引

时间:2013-02-19 17:54:33

标签: group-by dataframe transform pandas

我对这个问题的动机是我正在尝试重复删除记录。有些字段可以删除,但我想要其他字段的总和。 对于以下数据框,

In [48]: rand = np.random.RandomState(1)
         df = pd.DataFrame({'A': ['foo', 'bar'] * 2 + ['baz', 'qux'],
                                        'B': rand.randn(6),
                                        'C': rand.randint(0, 20, 6),
         })
In [49]: df.sort('A', inplace=1)
Out[49]:      A         B   C
         1  bar -0.611756  18
         3  bar -1.072969  10
         4  baz  0.865408  14
         2  foo -0.528172  11
         0  foo  1.624345   5
         5  qux -2.301539  18

我想对具有相同A值的记录进行重复数据删除,但保留B(在某些情况下可能为C)的总和。我认为groupby的转换应该做我想要的:

In [50]: df.groupby('A')[['B']].transform(sum)
Out[50]:           B
         1 -1.684725
         3 -1.684725
         4  0.865408
         2  1.096174
         0  1.096174
         5 -2.301539

但出于某种原因,我注意到当我在最后编制索引时它并没有给我我想要的东西:

In [51]: df.groupby('A').transform(sum)[['B']]
Out[51]:           B
         1 -0.611756
         3 -1.072969
         4  0.865408
         2 -0.528172
         0  1.624345
         5 -2.301539

为什么会有区别?此外,当我尝试转换2列时,它没有达到我的预期:

In [52]: df.groupby('A')[['B', 'C']].transform(sum) #same result as df.groupby('A').transform(sum)[['B', 'C']]
Out[52]:           B   C
         1 -0.611756  18
         3 -1.072969  10
         4  0.865408  14
         2 -0.528172  11
         0  1.624345   5
         5 -2.301539  18

我不介意这种情况的差异,但在我正在处理的应用程序中,它实际上正好相反,但我找不到一个再现它的例子(即df.groupby('A').transform(sum)[['B', 'C']]给出我想要的是什么,但更快df.groupby('A')[['B', 'C']].transform(sum)没有。

1 个答案:

答案 0 :(得分:0)

我认为这取决于transform方法。如果查看documentation,它会说transform返回一个对象,该对象的索引与被分组的对象相同(大小相同)。实际上是你的

df.groupby('A').transform(sum)[['B']]

根本不做任何总结。

如果您只需要总和,那么:

df.groupby('A')[['B']].sum()

或者这个:

df.groupby('A').sum()[['B']]

应该这样做,它们会产生相同的结果。