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 に答える