如何将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
相关产品推荐
相关产品推荐

