如何在Pandas中以两列为索引透视DataFrame完成指定格式转换?
在Pandas中实现长表到宽表的标签转换
这是典型的长格式数据转宽格式需求,在Pandas里有几种简洁的实现方式,我来详细说明:
方法一:使用pivot_table(推荐,逻辑清晰)
pivot_table是处理这类分组聚合转宽表的利器,直接通过参数就能完成统计和格式转换:
1. 构造示例数据
首先我们先还原你的原始数据集:
import pandas as pd raw_data = { 'Record ID': [1, 1, 2, 2, 1], 'Para': ['A', 'A', 'B', 'B', 'A'], 'Tag': ['x', 'y', 'x', 'y', 'z'] } df = pd.DataFrame(raw_data)
2. 执行转宽操作
# 用pivot_table分组统计,fill_value=0填充未出现的标签 pivoted = df.pivot_table( index=['Record ID', 'Para'], # 按这两列分组 columns='Tag', # 将Tag列的每个值转为新列 aggfunc='size', # 统计每个组合的出现次数(存在则为1) fill_value=0 # 未出现的标签填充为0 ).reset_index() # 把索引转回普通列 # 给标签列加上_Tag后缀,匹配目标格式 pivoted.columns = [col if col in ['Record ID', 'Para'] else f"{col}_Tag" for col in pivoted.columns] # 调整列顺序(可选,和目标输出完全对齐) pivoted = pivoted[['Record ID', 'Para', 'x_Tag', 'y_Tag', 'z_Tag']]
执行后得到的结果就是你想要的格式:
Record ID Para x_Tag y_Tag z_Tag 0 1 A 1 1 1 1 2 B 1 1 0
方法二:使用get_dummies + groupby
如果你更习惯用虚拟变量的方式处理标签,也可以这样实现:
# 先把Tag列转为虚拟变量(one-hot编码) tag_dummies = pd.get_dummies(df['Tag'], prefix='', prefix_sep='') # 合并原始分组列和虚拟变量列,再分组求和 result = pd.concat([df[['Record ID', 'Para']], tag_dummies], axis=1) result = result.groupby(['Record ID', 'Para']).sum().reset_index() # 重命名标签列 result.columns = [col if col in ['Record ID', 'Para'] else f"{col}_Tag" for col in result.columns]
这个方法的效果和第一种完全一致,适合熟悉one-hot编码的场景。
内容的提问来源于stack exchange,提问作者kurious
相关产品推荐
相关产品推荐

