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)
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 ...
df=df.groupby('A').apply(lambda x: x.reset_index(drop=True)).drop('A',axis=1).reset_index()
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.
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
N'est-ce pas simplement grouped = grouped.apply(lambda x: x.reset_index())
?