如何筛选并重组Pandas DataFrame?透视表是否可行?
Pandas DataFrame 转换方案:透视表及更优替代
核心场景:长表↔宽表转换
大部分这类需求都是长表与宽表的互转,以下是针对不同场景的高效实现方案:
1. 长表转宽表(最常见需求)
如果你的原DataFrame是长格式(每行是一条属性记录),目标是转成宽格式(每行是一个主体的所有属性),优先用这几种方法:
方法1:pivot(无重复组合时首选)
语法简洁,性能最优,适合index+columns组合无重复的场景:
import pandas as pd # 示例原长表df df = pd.DataFrame({ '用户ID': ['A', 'A', 'B', 'B'], '指标': ['年龄', '性别', '年龄', '性别'], '值': [25, '男', 30, '女'] }) # 转换为宽表df2 df2 = df.pivot(index='用户ID', columns='指标', values='值').reset_index() df2.columns.name = None # 移除列名的层级标签
输出的df2:
用户ID 年龄 性别 0 A 25 男 1 B 30 女
方法2:pivot_table(处理重复组合)
如果index+columns存在重复行,需要聚合取值(比如求和、均值),用pivot_table:
# 含重复记录的原df df = pd.DataFrame({ '用户ID': ['A', 'A', 'A', 'B'], '指标': ['年龄', '年龄', '性别', '年龄'], '值': [25, 26, '男', 30] }) # 以均值聚合重复的年龄数据 df2 = df.pivot_table( index='用户ID', columns='指标', values='值', aggfunc='mean' # 可替换为sum、first等聚合函数 ).reset_index() df2.columns.name = None
方法3:set_index + unstack(复杂多索引场景)
灵活性极强,适合包含多级索引/列的复杂转换,性能与pivot相当:
df2 = df.set_index(['用户ID', '指标'])['值'].unstack().reset_index() df2.columns.name = None
2. 宽表转长表
如果需求是宽表转长表,用melt是标准方案:
# 示例原宽表df df = pd.DataFrame({ '用户ID': ['A', 'B'], '年龄': [25, 30], '性别': ['男', '女'] }) # 转换为长表df2 df2 = df.melt( id_vars='用户ID', # 保留作为标识的列 var_name='指标', # 原列名转为新列的名称 value_name='值' # 原单元格值转为新列的名称 )
方案选择建议
- 无重复记录的长转宽:优先用
pivot,最快最简洁 - 有重复记录需要聚合:用
pivot_table - 复杂多索引/列转换:用
set_index+unstack - 宽转长:直接用
melt
如果你的DataFrame有特殊结构(比如多级列、复合索引),可以补充具体的样本数据,能给出更精准的实现代码。
内容的提问来源于stack exchange,提问作者Aragorn64
相关产品推荐
相关产品推荐

