この問題に対する私の動機は、レコードの重複除去を試みていることです。一部のフィールドは削除できますが、他のフィールドの合計が必要です。次のデータフレームの場合、
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)
しません)。