1

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

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)没有)。

4

1 回答 1

0

我认为这在于transform方法。如果您查看文档,它会说transform返回一个与被分组的对象索引相同(相同大小)的对象。事实上你的

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

根本不做任何总结。

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

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

或这个:

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

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

于 2013-02-19T18:24:47.443 回答