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

如何将Pandas DataFrame的多行键值数据重塑为布尔矩阵?

实现Pandas DataFrame的重塑(长表转宽表,标记是否出现)

这其实是典型的长表转宽表并标记存在性的需求,用Pandas可以用好几种方法轻松实现,我给你列几个常用的方案:

首先先准备好原始数据:

import pandas as pd

# 构造原始DataFrame
df = pd.DataFrame({
    'id': [1, 1, 1, 1, 2],
    'key': ['A', 'B', 'B', 'C', 'C']
})

方法一:使用pd.crosstab(最直观)

pd.crosstab天生就是用来生成交叉统计表的,我们可以先统计每个id和key的出现次数,再把大于1的数值截断为1(因为只要出现过就标记为1):

# 生成交叉表,再将计数转为1/0标记
result = pd.crosstab(df['id'], df['key']).clip(upper=1)
# 如果需要把id从索引转为普通列
result = result.reset_index()

运行后得到的结果就和你想要的格式完全一致了。

方法二:使用pivot_table(灵活的聚合方式)

利用透视表的聚合功能,直接判断每个id-key组合是否存在,再转为整数类型:

# 以id为行,key为列,聚合逻辑为"是否存在",再转成1/0
result = df.pivot_table(index='id', columns='key', aggfunc='any').astype(int)
result = result.reset_index()

这里aggfunc='any'会返回布尔值(存在为True,不存在为False),astype(int)会自动把True转1、False转0。

方法三:独热编码+分组取最大值

先用get_dummies把key列转成独热编码,再按id分组取最大值(只要出现过一次,最大值就是1):

# 生成key的独热编码
dummies = pd.get_dummies(df['key'])
# 拼接id列后按id分组取最大值
result = pd.concat([df['id'], dummies], axis=1).groupby('id').max().reset_index()

这种方法适合需要对独热编码做额外处理的场景,灵活性也很高。

不管用哪种方法,最终输出的结果都会符合你的要求:

id  A  B  C
0   1  1  1  1
1   2  0  0  1

内容的提问来源于stack exchange,提问作者bry888

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:17:15