pandas 实现多数值列拆为行维度、类别值转列的 pivot 数据重塑方法
Pandas 结构转换实现方案
操作逻辑说明
你之前操作没达到预期的核心原因是:原始DataFrame是双数值列宽表结构,每行同时存储value1、value2两个指标值,而pivot、pivot_table、transpose类操作默认适配单值长表,直接使用会生成多层索引,无法生成你要求的values标识列。
正确操作分两步走:先通过melt把分散的两个数值列拉成长表、生成指标标识列,再通过pivot把name字段的取值转为独立列。
完整可运行代码
import pandas as pd # 1. 构造与描述完全匹配的原始DataFrame df = pd.DataFrame({ "date": ["2021-01-01", "2021-01-01", "2021-01-02", "2021-01-02"], "name": ["first", "second", "first", "second"], "value1": [1, 5, 6, 3], "value 2": [2, 7, 8, 9] # 注意原始字段的空格笔误 }) # 修正原始字段名的空格问题,避免后续操作报错 df = df.rename(columns={"value 2": "value2"}) # 2. 宽转长,生成values指标标识列 long_df = df.melt( id_vars=["date", "name"], # 保留为维度的列 value_vars=["value1", "value2"], # 需要合并的数值列 var_name="values", # 存储指标名称的新列名 value_name="temp_val" # 存储实际数值的临时列 ) # 3. 把name字段的取值转成独立列 result = long_df.pivot( index=["date", "values"], # 行维度:日期 + 指标名 columns="name", # 要转成独立列的字段 values="temp_val" # 匹配的实际值 ).reset_index() # 还原索引为普通列
最终输出结构
生成的目标DataFrame完全匹配要求:
| date | values | first | second |
|---|---|---|---|
| 2021-01-01 | value1 | 1 | 5 |
| 2021-01-01 | value2 | 2 | 7 |
| 2021-01-02 | value1 | 6 | 3 |
| 2021-01-02 | value2 | 8 | 9 |
常见踩坑提示
- 直接对原始宽表调用
pivot会自动为value1、value2生成双层列索引,无法生成单独的values标识列,不符合需求 transpose仅会交换行和列的位置,无法自动合并分散的数值列,对本场景无作用- 如果后续需要兼容缺失值场景,可以在pivot步骤替换为
pivot_table,添加聚合规则即可,核心逻辑不变
内容的提问来源于stack exchange,提问作者Luc
相关产品推荐
相关产品推荐

