python - 将列和子列转换为行
问题描述
我在带有列标记和子列 $ 的 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' } )
解决方案
# 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
这里的工作示例
推荐阅读
- php - 使用多个过滤器过滤数据时,在选择一个特定过滤器之前,所有过滤器都不会显示数据
- laravel-6 - 在laravel中下载excel文件时数组到字符串约定问题
- ios - 是否可以将 Twilio Vedio SDK 用于音频和视频通话?
- django - auto_now_add 和 auto_now 作为纪元
- html - Href 模态重定向问题仅适用于谷歌浏览器?
- swift - Swift:如何在字符串中查找替换一组字符,从预定义字符开始并以另一个字符结束
- django - django_pandas.io read_frame() 给出太多 SQL 变量错误
- javascript - 无法使用js访问输入值
- selenium - Python Selenium 在某些页面上挂起
- python - pandas - groupby 多列并获取其他列的唯一计数