如何使用Python基于特定列将表格列转换为行?
用Python实现基于特定列的表格列转行操作
你要的这种**列转行(宽表转长表)**操作,用pandas的melt函数就能搞定,之前没成功大概率是参数没设置到位。下面给你具体的实现方法:
示例场景说明
假设你的原始数据逻辑如下:
| 学生姓名 | 数学 | 英语 | 物理 |
|---|---|---|---|
| 张三 | 92 | 85 | 78 |
| 李四 | 80 | 91 | 88 |
预期转成的结果是:
| 学生姓名 | 科目 | 分数 |
|---|---|---|
| 张三 | 数学 | 92 |
| 张三 | 英语 | 85 |
| 张三 | 物理 | 78 |
| 李四 | 数学 | 80 |
| 李四 | 英语 | 91 |
| 李四 | 物理 | 88 |
代码实现
import pandas as pd # 创建原始数据 df = pd.DataFrame({ "学生姓名": ["张三", "李四"], "数学": [92, 80], "英语": [85, 91], "物理": [78, 88] }) # 用melt实现列转行 # id_vars:指定要保留的特定列(不参与转行的列) # var_name:转行后,原列名对应的新列名 # value_name:转行后,原列值对应的新列名 result_df = df.melt(id_vars=["学生姓名"], var_name="科目", value_name="分数") print(result_df)
关键参数解释
id_vars:必填,把你想保留的特定标识列放这里,比如示例中的「学生姓名」,这些列不会被转成行,会作为每一行的分组标识。var_name:可选,自定义转行后原列名的列标题,默认是「variable」。value_name:可选,自定义转行后原列值的列标题,默认是「value」。
为什么transpose没用?
transpose()是把整个表格的行列完全互换,包括你的标识列,转出来的结果会把「学生姓名」变成列名,显然不符合你要保留特定列、只转其他列的需求,所以这个方法不适用。
多标识列的情况
如果需要保留多个特定列(比如同时保留「学生姓名」和「班级」),只需要把这些列都放进id_vars列表里就行:
df = pd.DataFrame({ "学生姓名": ["张三", "李四"], "班级": ["一班", "二班"], "数学": [92, 80], "英语": [85, 91], "物理": [78, 88] }) result_df = df.melt(id_vars=["学生姓名", "班级"], var_name="科目", value_name="分数")
内容的提问来源于stack exchange,提问作者Fasih Shaikh
相关产品推荐
相关产品推荐

