#python #pandas #dataframe
Вопрос:
Предположим, у меня есть фрейм данных 2*3:
df = pd.DataFrame({'A': [1, 2], 'B': [3, 4], 'C': [5, 6]})
A B C
0 1 3 5
1 2 4 6
Мне интересно, как я могу преобразовать df
в (2*3)*1 кадр данных, который имеет следующую форму? Я пробовал pd.DataFrame.explode()
, pd.wide_to_long()
но, похоже, это не та функция, которую я ищу.
value
A 0 1
A 1 2
B 0 3
B 1 4
C 0 5
C 1 6
Комментарии:
1. Попробовать
df.melt(ignore_index=False)
?2. @Крис, молодец 😉
Ответ №1:
Вам просто нужно stack
:
df.stack().swaplevel().sort_index()
выход:
A 0 1
1 2
B 0 3
1 4
C 0 5
1 6
Или используйте melt
после сброса индекса:
df.reset_index().melt(id_vars='index')
выход:
index variable value
0 0 A 1
1 1 A 2
2 0 B 3
3 1 B 4
4 0 C 5
5 1 C 6
Альтернативные результаты
Как фрейм данных:
(df.stack()
.rename('value')
.swaplevel()
.sort_index()
.to_frame()
)
value
A 0 1
1 2
B 0 3
1 4
C 0 5
1 6
Все в виде столбцов:
(df.stack()
.rename('value')
.swaplevel()
.rename_axis(['col1', 'col2'])
.sort_index()
.reset_index()
)
col1 col2 value
0 A 0 1
1 A 1 2
2 B 0 3
3 B 1 4
4 C 0 5
5 C 1 6