You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:41:51