Как сбросить индексы DataFrame для всех групп за один шаг?

Я попытался разделить свой файл данных на группы

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')

Я получаю 2 группы

     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

Теперь я хочу индексы reset для каждой группы отдельно

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

Наконец, я получаю результат

     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

Есть ли лучший способ, как это сделать? (Например: автоматически вызывать метод для каждой группы)

Ответ 1

Перейдите в as_index=False к groupby, тогда вам не нужно reset_index, чтобы снова создать столбцы столбцов groupby-d:

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

Примечание. Как указано (и показано в приведенном выше примере), указанный выше индекс не является [0, 1, 2, ...], я утверждаю, что это никогда не имеет значения на практике - если вам это нужно, просто через какие-то странные обручи - он будет более подробным, менее читаемым и менее эффективным...

Ответ 2

df=df.groupby('A').apply(lambda x: x.reset_index(drop=True)).drop('A',axis=1).reset_index()

Ответ 3

Что-то вроде этого будет работать:

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

Возможно, вы могли бы сделать его менее подробным, если хотите.

Ответ 4

Разве это не просто grouped = grouped.apply(lambda x: x.reset_index())?

Ответ 5

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)

мы получаем две группы

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

Результатом будет добавление двух новых столбцов level_0 и level_1 и сброс индекса


 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')

Создает индекс в каждой группе "А"

          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