web-dev-qa-db-fra.com

Comment réinitialiser les index d'un DataFrame pour tous les groupes en une seule étape?

J'ai essayé de scinder mon cadre de données en groupes

df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
                       'foo', 'bar', 'foo', 'foo'],
                   'B' : ['1', '2', '3', '4',
                       '5', '6', '7', '8'],
                   })

grouped = df.groupby('A')

Je reçois 2 groupes

     A  B
0  foo  1
2  foo  3
4  foo  5
6  foo  7
7  foo  8

     A  B
1  bar  2
3  bar  4
5  bar  6

Maintenant, je veux réinitialiser les index pour chaque groupe séparément

print grouped.get_group('foo').reset_index()
print grouped.get_group('bar').reset_index()

Enfin j'obtiens le résultat

     A  B
0  foo  1
1  foo  3
2  foo  5
3  foo  7
4  foo  8

     A  B
0  bar  2
1  bar  4
2  bar  6

Y a-t-il une meilleure façon de faire cela? (Par exemple: appeler automatiquement une méthode pour chaque groupe)

10
Meloun

Transmettez as_index=False à groupby. Dans ce cas, vous n'avez pas besoin de reset_index pour créer à nouveau les colonnes groupby-d colonnes:

In [11]: grouped = df.groupby('A', as_index=False)

In [12]: grouped.get_group('foo')
Out[12]:
     A  B
0  foo  1
2  foo  3
4  foo  5
6  foo  7
7  foo  8

Remarque: comme indiqué (et vu dans l'exemple ci-dessus), l'index ci-dessus est non [0, 1, 2, ...], je prétends que cela n'aura jamais d'importance en pratique - si vous le faites, vous devrez simplement traverser d'étranges cerceaux - ça va être plus bavard, moins lisible et moins efficace ...

16
Andy Hayden
df=df.groupby('A').apply(lambda x: x.reset_index(drop=True)).drop('A',axis=1).reset_index()
1
Songhua Hu

Quelque chose comme ça marcherait:

for group, index in grouped.indices.iteritems():
    grouped.indices[group] = range(0, len(index))

Vous pourriez probablement le rendre moins verbeux si vous le souhaitiez.

0
Greg
df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
                       'foo', 'bar', 'foo', 'foo'],
                   'B' : ['1', '2', '3', '4',
                       '5', '6', '7', '8'],
                   })
grouped = df.groupby('A',as_index = False)

nous avons deux groupes

grouped_index = grouped.apply(lambda x: x.reset_index(drop = True)).reset_index()

Résultat: deux nouvelles colonnes level_0 et level_1 sont ajoutées et l'index est réinitialisé.


 level_0level_1 A   B
0   0     0    bar  2
1   0     1    bar  4
2   0     2    bar  6
3   1     0    foo  1
4   1     1    foo  3
5   1     2    foo  5
6   1     3    foo  7
7   1     4    foo  8
result = grouped_index.drop('level_0',axis = 1).set_index('level_1')

Crée un index dans chaque groupe de "A"

          A     B
level_1     
0        bar    2
1        bar    4
2        bar    6
0        foo    1
1        foo    3
2        foo    5
3        foo    7
4        foo    8
0

N'est-ce pas simplement grouped = grouped.apply(lambda x: x.reset_index())?

0
BAC83