web-dev-qa-db-ja.com

groupby 2列の後にDataFrameの元のインデックスを保持する方法は?

Groupbyを実行した後、大きなデータフレームの元のインデックスを保持する方法はありますか?これが必要な理由は、失われた列を取り戻すために、元のdf(groupbyの後)に内部マージを戻す必要があるためです。そして、インデックス値は、マージを元に戻す唯一の「一意の」列です。誰も私がこれを達成する方法を知っていますか?

私のDataFrameは非常に大きいです。私のグループは次のようになります。

df.groupby(['col1', 'col2'], ).agg({'col3': 'count'}).reset_index()

これにより、保持したい元のデータフレームから元のインデックスが削除されます。

9
Hana

あなたはこの状況で変革を求めていると思います:

df['count'] = df.groupby(['col1', 'col2'])['col3'].transform('count')
2
Scott Boston

reset_indexを使用して、インデックスを列に昇格できます。次に、agg集約とともに、countを介してインデックスをTupleに集約します。

以下は最小限の例です。

import pandas as pd, numpy as np

df = pd.DataFrame(np.random.randint(0, 4, (50, 5)),
                  index=np.random.randint(0, 4, 50))

df = df.reset_index()

res = df.groupby([0, 1]).agg({2: 'count', 'index': lambda x: Tuple(x)}).reset_index()

#     0  1  2            index
# 0   0  0  4     (2, 0, 0, 2)
# 1   0  1  4     (0, 3, 1, 1)
# 2   0  2  1             (1,)
# 3   0  3  1             (3,)
# 4   1  0  4     (1, 2, 1, 3)
# 5   1  1  2           (1, 3)
# 6   1  2  4     (2, 1, 2, 2)
# 7   1  3  1             (2,)
# 8   2  0  5  (0, 3, 0, 2, 2)
# 9   2  1  2           (0, 2)
# 10  2  2  5  (1, 1, 3, 3, 2)
# 11  2  3  2           (0, 1)
# 12  3  0  4     (0, 3, 3, 3)
# 13  3  1  4     (1, 3, 0, 1)
# 14  3  2  3        (3, 2, 1)
# 15  3  3  4     (3, 3, 2, 1)
2
jpp

元のインデックスを保持する場合は、「reset_index()」を使用しないでください

0
manoj