将列和子列转换为行

  • 本文关键字:转换 python pandas melt
  • 更新时间 :
  • 英文 :


我有以下数据在一个Excel文件与列标记&子列$

|   Marks   |
______________________
Student | $ |%  |#  |
______________________
Joy     | 7 |2  |0  |
RED     | 9 |2  |5  |
CTL     | 5 |0  |4  |

我想把列转换成行,格式如下:

Student | Marks | Symbol |
--------|-------|--------|
Joy     | 7     |    $   |
Joy     | 2     |    %   |
Joy     | 0     |    #   |   
RED     | 9     |    $   | 
RED     | 2     |    %   |
RED     | 5     |    #   | 
CTL     | 5     |    $   |
CTL     | 0     |    %   | 
CTL     | 4     |    #   |

转换成行,我使用这个代码进行转换。我想从列到行转换后,上面的输出,但得到一些随机值。需要做什么才能得到上面的输出?

import numpy as np
import pandas as pd
df = pd.read_excel('test.xlsx')
tdf = df.reset_index( col_level = 1 )
tdf
dfs = pd.melt( tdf, id_vars = ['Student'], value_vars = [ '$', '%', '#' ], col_level = 1, var_name = 'Symbol' )
dfs = dfs.rename( columns = { 'value': 'Marks' } )

首先要做的是将Student移动到DataFrame中,如果它是索引。

tdf = df.reset_index( col_level = 1 )

则可以执行pd.melt

dfs = pd.melt( tdf, id_vars = [ 'Student' ], value_vars = [ '$', '%', '#' ], col_level = 1, var_name = 'Symbol' )
dfs = dfs.rename( columns = { 'value': 'Marks' } )
# Sample df
symbols = np.array(['$', '%', '#'])
data = [
['Joy', 7,2,0],
['Red', 9,2,5],
['CTL', 5,0,4]
]
id_vars = [('', 'Student')]
value_vars = [('Marks', i) for i in symbols]
columns = pd.MultiIndex.from_tuples(id_vars + value_vars)
df = pd.DataFrame(data, columns = columns)
# df:
#|           Marks      
#|   Student     $  %  #
#| 0     Joy     7  2  0
#| 1     Red     9  2  5
#| 2     CTL     5  0  4
tdf = df.reset_index()
dfs = pd.melt( tdf, id_vars = [ 'Student' ], value_vars = [ '$', '%', '#' ], col_level = 1, var_name = 'Symbol' )
dfs = dfs.rename( columns = { 'value': 'Marks' } )
# dfs:
#|   Student Symbol  Marks
#| 0     Joy      $      7
#| 1     Red      $      9
#| 2     CTL      $      5
#| 3     Joy      %      2
#| 4     Red      %      2
#| 5     CTL      %      0
#| 6     Joy      #      0
#| 7     Red      #      5
#| 8     CTL      #      4
ntdata = np.hstack((df.T.values[1:], np.array_split(symbols, len(symbols))))
ndf = pd.DataFrame(ntdata)
ncolumns = df[('', 'Student')].values.tolist()
ndf.columns = ncolumns + ['Symbol']
ndf = ndf.melt(id_vars = [ 'Symbol' ], value_vars = ncolumns, var_name = 'Student' )
ndf = ndf.rename( columns = { 'value': 'Marks' } )
# ndf:
#|   Symbol Student  Marks
#| 0      $     Joy      7
#| 1      %     Joy      2
#| 2      #     Joy      0
#| 3      $     Red      9
#| 4      %     Red      2
#| 5      #     Red      5
#| 6      $     CTL      5
#| 7      %     CTL      0
#| 8      #     CTL      4

这里的工作示例

最新更新