尝试pivot、transpose未成功,如何用Pandas转置单列值为多列?
Pandas 长表转宽表实现方案
你遇到的是Pandas中最常见的长表转宽表场景,之前用pivot、transpose没得到预期结果,基本都是参数错配或者混淆了方法适用场景,不需要手动循环拼接行数据,按以下步骤就能快速生成符合要求的df2:
- 先理清三类核心字段和目标结构的对应关系:
- 行维度字段:最终在新表中作为行唯一标识的字段,比如不需要拆分展开的
Id、Date类维度 - 列名来源字段:需要把该字段的所有取值展开成新表独立列的字段,比如存储指标名称的
Parameter列 - 数值字段:需要填充到新表对应单元格的实际值,比如存储测量值的
Value列
- 行维度字段:最终在新表中作为行唯一标识的字段,比如不需要拆分展开的
- 核心转换代码,注意不要混用
transpose:df2 = df1.pivot( index=["Id", "Date"], # 填入所有作为行维度的字段列表 columns="Parameter", # 填入需要展开成独立列名的字段 values="Value" # 填入对应单元格的填充值字段 ).reset_index() # 这步不能省:把pivot生成的多层行索引还原成普通列,避免出现嵌套的索引层级 - 常见踩坑点:
- 如果调用
pivot时报索引重复错误,说明同一组行维度+列维度的组合存在多个数值,这时候换成pivot_table并指定聚合规则(比如取均值、求和、取最大值)即可解决,纯pivot本身就不支持重复键的场景 transpose是用来整体互换行和列的矩阵转置操作,和“把某字段取值展开成列”的需求完全不匹配,混用自然得不到想要的结果
- 如果调用
- 结果校验:
执行完上述代码后,生成的df2会自动匹配目标结构:所有行维度字段成为普通列,原待展开字段的每个取值生成独立的数值列,没有对应数值的位置自动填充为NaN。
内容的提问来源于stack exchange,提问作者Liam Boyd
相关产品推荐
相关产品推荐

