Панды: как преобразовать фрейм данных M*N в (M*N)*1 фрейм данных

#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