如何实现DataFrame列转多行且指定行保持不变的格式转换
实现方案
你需要的是宽表转长表的操作,使用Pandas的melt方法即可实现,操作逻辑如下:
- 首先确认固定保留列:即需要保持不变的列,在方法的
id_vars参数中指定这些列即可 - 其次确认需要转成行的列:在方法的
value_vars参数中指定对应列,若省略该参数,默认会将所有未加入id_vars的列全部做行转换 - 转换后会生成两个自定义名称的新列:存储原列名的列通过
var_name指定名称,存储原列值的列通过value_name指定名称
示例代码
import pandas as pd # 替换为你自己的DataFrame读取逻辑,此处为模拟原始数据 df = pd.DataFrame({ "部门": ["技术部", "市场部"], "人员ID": ["A001", "B001"], "姓名": ["张三", "李四"], "1月绩效": [95, 88], "2月绩效": [92, 90], "3月绩效": [89, 94] }) # 执行转换 converted_df = df.melt( id_vars=["部门", "人员ID", "姓名"], # 保留不变的列 var_name="统计月份", # 原列名转为新列的字段名 value_name="绩效分数" # 原列值转为新列的字段名 ) print(converted_df)
转换效果说明
原始宽表结构:
| 部门 | 人员ID | 姓名 | 1月绩效 | 2月绩效 | 3月绩效 |
|---|---|---|---|---|---|
| 技术部 | A001 | 张三 | 95 | 92 | 89 |
| 市场部 | B001 | 李四 | 88 | 90 | 94 |
转换后长表结构:
| 部门 | 人员ID | 姓名 | 统计月份 | 绩效分数 |
|---|---|---|---|---|
| 技术部 | A001 | 张三 | 1月绩效 | 95 |
| 市场部 | B001 | 李四 | 1月绩效 | 88 |
| 技术部 | A001 | 张三 | 2月绩效 | 92 |
| 市场部 | B001 | 李四 | 2月绩效 | 90 |
| 技术部 | A001 | 张三 | 3月绩效 | 89 |
| 市场部 | B001 | 李四 | 3月绩效 | 94 |
内容的提问来源于stack exchange,提问作者Shax Studio
相关产品推荐
相关产品推荐

