如何使用Python的Pandas同时实现分列(text to Columns)和逆透视(Unpivoting)
Pandas 分列+逆透视转换实现方案
方法1:先逆透视再分列(逻辑更直观,适合新手)
操作步骤:
- 先通过
melt方法完成逆透视,保留原始表中的固定维度列 - 对逆透视后生成的复合维度列做分列拆分
import pandas as pd # 逆透视:id_vars替换为你需要保留的固定列名,例如["产品类别", "地区"] df_unpivot = df3.melt( id_vars=["固定列1", "固定列2"], var_name="复合列存储字段", value_name="数值列" ) # 分列:将分隔符替换为你实际使用的分隔符,例如下划线、逗号、斜杠等 # expand=True 直接返回分列后的多列数据框 df_unpivot[["拆分维度1", "拆分维度2"]] = df_unpivot["复合列存储字段"].str.split("_", expand=True) # 可选:删除冗余列、调整列顺序 df_result = df_unpivot.drop(columns=["复合列存储字段"])[["固定列1", "固定列2", "拆分维度1", "拆分维度2", "数值列"]]
方法2:先拆分列名再逆透视(执行效率更高,适合大表)
如果你的复合维度存储在原始列名中,可以直接拆分列名生成多级索引后堆叠,一步完成转换:
# 拆分原始列名,生成多级列索引 df3.columns = df3.columns.str.split("_", expand=True) # 设置固定列为行索引后,堆叠多级列索引完成逆透视 df_result = df3.set_index(["固定列1", "固定列2"]).stack([0, 1]).reset_index(name="数值列") # 可选:重命名拆分后的维度列 df_result = df_result.rename(columns={ "level_2": "拆分维度1", "level_3": "拆分维度2" })
注意事项
- 若只需拆分前N个分隔符,可在
str.split中添加n=N参数,例如str.split("_", n=1, expand=True)表示仅拆分第一个下划线 - 若拆分后存在空值,可搭配
dropna方法过滤无效行 - 无固定保留列时,
id_vars参数可传入空列表[]
内容的提问来源于stack exchange,提问作者arsalaan9
相关产品推荐
相关产品推荐

