如何基于Pandas的ID列对Names列生成目标独热编码数据框?
解决方法:长格式转宽格式二进制矩阵
嘿,我懂你要做的这个转换——把长格式的ID关联多名称的数据转成宽格式的二进制标记表对吧?你试过的groupby和pd.get_dummies其实是关键,只是没把它们正确结合起来而已,我给你个可行的方案:
实现步骤
- 生成独热编码:用
pd.get_dummies把Names列转换成二进制列,每一行对应一个名称的标记(存在为1,不存在为0)。 - 分组聚合:按
ID分组,对每个名称列求和(或取最大值),这样同一ID下的所有名称标记会被合并到一行里。 - 调整格式:重置索引让
ID回到列中,匹配你想要的输出样式。
完整代码示例
import pandas as pd # 模拟你的输入数据框 df = pd.DataFrame({ 'ID': [1, 1, 2, 2], 'Names': ['func_A', 'func_B', 'rain', 'fire'] }) # 1. 生成Names的独热编码,并和ID列合并 dummies_df = pd.concat([df['ID'], pd.get_dummies(df['Names'])], axis=1) # 2. 按ID分组求和,聚合同一ID下的所有标记 result_df = dummies_df.groupby('ID').sum().reset_index() # 查看结果 print(result_df)
输出结果
ID func_A func_B rain fire 0 1 1 1 0 0 1 2 0 0 1 1
补充说明
- 如果你的数据中同一ID下可能存在重复的Names,可以把
sum()换成max(),这样即使重复也只会得到1(确保标记是0/1的二进制格式):result_df = dummies_df.groupby('ID').max().reset_index() - 之前单独用
pd.get_dummies只会生成每行的标记,没有合并同一ID的记录;单独用groupby又缺少独热编码的转换,把两者结合就正好满足需求啦。
内容的提问来源于stack exchange,提问作者data_person
相关产品推荐
相关产品推荐

