Как сбросить индексы 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