我对这个问题的动机是我正在尝试重复删除记录。有些字段可以删除,但我想要其他字段的总和。 对于以下数据框,
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)
没有。
答案 0 :(得分:0)
我认为这取决于transform
方法。如果查看documentation,它会说transform
返回一个对象,该对象的索引与被分组的对象相同(大小相同)。实际上是你的
df.groupby('A').transform(sum)[['B']]
根本不做任何总结。
如果您只需要总和,那么:
df.groupby('A')[['B']].sum()
或者这个:
df.groupby('A').sum()[['B']]
应该这样做,它们会产生相同的结果。