Есть ли способ разгруппировать группу по данным

Я хотел бы разгруппировать фрейм данных после применения группы по условию. Я использовал pandas group by & sum для группировки. Ниже приведена группа по таблице

+------------+--------------+----------------+-----------------+
|   Month    | Amt_8_red_17 | Amt_8_black_29 | Amt_10_black_29 |
+------------+--------------+----------------+-----------------+
| 01-01-2018 |            0 |             12 |              18 |
| 01-02-2018 |          100 |             12 |              12 |
+------------+--------------+----------------+-----------------+

Теперь я хочу разгруппировать данные. Имена столбцов представляют собой комбинацию столбцов, соединенных символом подчеркивания. например: Amt_8_red_17 : имена столбцов (количество, количество, цвет, идентификатор) вывод выглядит так

+------------+---------+-------+-------+----+
|   Month    | Amount  | Count | Color | Id |
+------------+---------+-------+-------+----+
| 01-01-2018 |       0 |     8 | red   | 17 |
| 01-01-2018 |      12 |     8 | black | 29 |
| 01-01-2018 |      18 |    10 | black | 29 |
| 01-02-2018 |     100 |     8 | red   | 17 |
| 01-02-2018 |      12 |     8 | black | 29 |
| 01-02-2018 |      12 |    10 | black | 29 |
+------------+---------+-------+-------+----+

Есть ли более быстрый способ?


person Community    schedule 15.03.2019    source источник
comment
Более быстрый способ чего?   -  person roganjosh    schedule 15.03.2019


Ответы (1)


Сначала создайте индекс по всем столбцам без _ с помощью DataFrame.set_index при необходимости.

Затем создайте MultiIndex с помощью str.split и изменить форму с помощью DataFrame.unstack.

Последняя очистка данных — сначала удалите первый уровень DataFrame.reset_index , второй — для столбцов из MultiIndex. Последний набор новых имен столбцов.

df = df.set_index('Month')
df.columns = df.columns.str.split('_', expand=True)
df = df.unstack().reset_index(level=0, drop=True).reset_index()
df.columns= ['Count','Color','Id','Month','Amount']
print (df)
  Count  Color  Id       Month  Amount
0     8    red  17  01-01-2018       0
1     8    red  17  01-02-2018     100
2     8  black  29  01-01-2018      12
3     8  black  29  01-02-2018      12
4    10  black  29  01-01-2018      18
5    10  black  29  01-02-2018      12

Последнее при необходимости изменить порядок столбцов:

df = df[['Month','Amount','Count','Color','Id']]
print (df)
        Month  Amount Count  Color  Id
0  01-01-2018       0     8    red  17
1  01-02-2018     100     8    red  17
2  01-01-2018      12     8  black  29
3  01-02-2018      12     8  black  29
4  01-01-2018      18    10  black  29
5  01-02-2018      12    10  black  29
person jezrael    schedule 15.03.2019
comment
Спасибо @jezrael - person ; 15.03.2019