我有以下数据在一个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
这里的工作示例