#python #pandas #reshape #multi-index
Вопрос:
Я довольно хорошо разбираюсь в простых Пандах, но борюсь с изменением формы данных и несколькими индексами. У меня есть фрейм данных multindex, который выглядит так (это не обязательно должен быть multindex, но это кажется правильным)
Имя | Указатель | f1 | f2 | f3 | calc1 | calc2 | calc3 |
---|---|---|---|---|---|---|---|
лиса | 1 | красный | Белый | мех | 0.21 | 1.67 | -0.34 |
2 | 0.76 | 2.20 | -1.02 | ||||
3 | 0.01 | 1.12 | -0.22 | ||||
курица | 1 | Белый | Желтый | перья | 0.04 | 1.18 | -2.01 |
2 | 0.18 | 0.73 | -1.21 | ||||
зерно | 1 | Желтый | сумка | кукуруза | 0.89 | 1.65 | -1.03 |
2 | 0.34 | 2.45 | -0.45 | ||||
3 | 0.87 | 1.11 | -0.97 |
и все, чего я хочу, это:
Имя | f1 | f2 | f3 | calc1_1 | calc2_1 | calc3_1 | calc1_2 | calc2_2 | calc3_2 | calc1_3 | calc2_3 | calc3_3 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
лиса | красный | Белый | мех | 0.21 | 1.67 | -0.34 | 0.76 | 2.20 | -1.02 | 0.01 | 1.12 | -0.22 |
курица | Белый | Желтый | перья | 0.04 | 1.18 | -2.01 | 0.18 | 0.73 | -1.21 | NaN | NaN | NaN |
зерно | Желтый | сумка | кукуруза | 0.89 | 1.65 | -1.03 | 0.34 | 2.45 | -0.45 | 0.87 | 1.11 | -0.97 |
Я полагаю, что это должно быть легко для гуру панд. Спасибо всем за вашу помощь!!
Нарисовал
Ответ №1:
Попробуйте set_index
unstack
изменить форму в длинный формат
new_df = df.set_index(['name', 'index', 'f1', 'f2', 'f3']).unstack('index')
ИЛИ через pivot
new_df = df.pivot(index=['name', 'f1', 'f2', 'f3'], columns='index')
Сортировка мультииндекса с помощью sort_index
:
new_df = new_df.sort_index(axis=1, level=1)
Затем уменьшите мультииндекс с помощью map
reset_index
:
new_df.columns = new_df.columns.map(lambda s: '_'.join(map(str, s)))
new_df = new_df.reset_index()
new_df
:
name f1 f2 f3 calc1_1 calc2_1 calc3_1 calc1_2 calc2_2 calc3_2 calc1_3 calc2_3 calc3_3
0 chicken white yellow feathers 0.04 1.18 -2.01 0.18 0.73 -1.21 NaN NaN NaN
1 fox red white fur 0.21 1.67 -0.34 0.76 2.20 -1.02 0.01 1.12 -0.22
2 grain yellow bag corn 0.89 1.65 -1.03 0.34 2.45 -0.45 0.87 1.11 -0.97
Полный Код:
import pandas as pd
df = pd.DataFrame({
'name': ['fox', 'fox', 'fox', 'chicken', 'chicken', 'grain', 'grain',
'grain'],
'index': [1, 2, 3, 1, 2, 1, 2, 3],
'f1': ['red', 'red', 'red', 'white', 'white', 'yellow', 'yellow', 'yellow'],
'f2': ['white', 'white', 'white', 'yellow', 'yellow', 'bag', 'bag', 'bag'],
'f3': ['fur', 'fur', 'fur', 'feathers', 'feathers', 'corn', 'corn', 'corn'],
'calc1': [0.21, 0.76, 0.01, 0.04, 0.18, 0.89, 0.34, 0.87],
'calc2': [1.67, 2.2, 1.12, 1.18, 0.73, 1.65, 2.45, 1.11],
'calc3': [-0.34, -1.02, -0.22, -2.01, -1.21, -1.03, -0.45, -0.97]
})
new_df = (
df.set_index(['name', 'index', 'f1', 'f2', 'f3'])
.unstack('index')
.sort_index(axis=1, level=1)
)
new_df.columns = new_df.columns.map(lambda s: '_'.join(map(str, s)))
new_df = new_df.reset_index()