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