web-dev-qa-db-fra.com

Comment conserver l'index d'origine d'un DataFrame après avoir été groupé par 2 colonnes?

Existe-t-il un moyen de conserver l'index d'origine de ma grande trame de données après avoir effectué un regroupement? La raison pour laquelle j'ai besoin de cela est parce que je dois faire une fusion interne vers mon df original (après mon groupby) pour retrouver ces colonnes perdues. Et la valeur d'index est la seule colonne «unique» dans laquelle effectuer la fusion. Est-ce que quelqu'un sait comment je peux y arriver? 

Mon DataFrame est assez grand. Mon groupe ressemble à ceci: 

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

Cela supprime mes index d'origine de mon image de données d'origine, que je souhaite conserver. 

4
Hana

Je pense que vous cherchez à transformer dans cette situation:

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

Vous ne devez pas utiliser 'reset_index ()' si vous souhaitez conserver vos index d'origine

0
manoj

Vous pouvez élever votre index à une colonne via reset_index. Puis agrégez votre index à un tuple via agg, avec votre agrégation count.

Vous trouverez ci-dessous un exemple minimal.

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)
0
jpp