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

#pandas

Вопрос:

Я группирую фрейм данных и хотел бы сбросить индекс с reset_index() помощью . Однако полученная ошибка указывает на то, что она не может вставить столбец, поскольку он уже существует. Я понимаю, как произошла ошибка, но не знаю, как ее исправить.

 d = {'c1':['a', 'a', 'b', 'b', 'c', 'c'], 'c2':['Low', 'High', 'Low', 'High', 'High', 'High']}
dd = pd.DataFrame(data=d)
dd.groupby('c1')['c2'].value_counts(normalize=True).mul(100).reset_index()
 

он возвращается

 c1  c2  
a   High     50.0
    Low      50.0
b   High     50.0
    Low      50.0
c   High    100.0
 

Я бы хотел, чтобы фрейм данных выглядел так

 c1  c2       percent
a   High     50.0
a   Low      50.0
b   High     50.0
b   Low      50.0
c   High    100.0
 

Как этого достичь ?

Ответ №1:

Ваш код (с reindex ) на самом деле не работает в моей системе, так как один из уровней имеет то же имя value_counts , что и серия.

Попробуйте reset_index с name :

 (dd.groupby('c1')['c2']
   .value_counts(normalize=True)
   .mul(100)
   .reset_index(name='percent')
)
 

Выход:

   c1    c2  percent
0  a  High     50.0
1  a   Low     50.0
2  b  High     50.0
3  b   Low     50.0
4  c  High    100.0
 

Ответ №2:

Потому c2 что столбец уже существует. Вместо этого вы можете попробовать это, чтобы получить результат вашего желания:

 df = dd.groupby('c1')['c2'].value_counts(normalize=True).mul(100)
                .to_frame().rename(columns={'c2': 'percent'}).reset_index()

print(df)

 c1    c2  percent
0  a  High     50.0
1  a   Low     50.0
2  b  High     50.0
3  b   Low     50.0
4  c  High    100.0