Python 3中如何将DataFrame列的集合值拆分为二进制指示列?
解决Pandas集合类型列转二进制指示列的问题
我来帮你搞定这个需求!要把DataFrame里的集合类型列拆成二进制指示列,同时保留原列,其实用Pandas的str.get_dummies配合一些小处理就能实现,不过因为你的列是集合类型(不是字符串),得先把集合转成逗号分隔的字符串,这样get_dummies才能识别。
完整代码示例
import pandas as pd # 原始DataFrame data = {'Amenities':[{'TV', 'Wifi'}, {'TV',"Cable TV",'Internet','Wifi'}, {'Internet','Wifi'}]} df2 = pd.DataFrame(data) # 步骤1:把集合转成逗号分隔的字符串 df2['Amenities_str'] = df2['Amenities'].apply(lambda x: ','.join(x)) # 步骤2:生成二进制指示列 dummies = df2['Amenities_str'].str.get_dummies(sep=',') # 步骤3:合并原DataFrame和指示列,然后删掉临时的字符串列 result_df = pd.concat([df2, dummies], axis=1).drop('Amenities_str', axis=1) print(result_df)
输出结果
你会得到和期望完全一致的DataFrame:
Amenities Cable TV Internet TV Wifi 0 {'TV', 'Wifi'} 0 0 1 1 1 {'TV', 'Wifi', 'Internet', 'Cable TV'} 1 1 1 1 2 {'Internet', 'Wifi'} 0 1 0 1
代码细节解释
- 集合转字符串:
str.get_dummies是针对字符串列设计的,所以用apply(lambda x: ','.join(x))把每个集合转成逗号分隔的字符串,比如{'TV','Wifi'}会变成'TV,Wifi'。 - 生成指示列:
str.get_dummies(sep=',')会自动提取所有唯一的设施作为列名,每行如果包含对应设施就标记为1,否则为0。 - 合并与清理:用
pd.concat把原DataFrame和生成的指示列横向合并,最后删掉临时创建的字符串列,保留原始的Amenities列。
这样既保留了原始的集合列,又得到了需要的二进制指示列,完美匹配你的需求!
内容的提问来源于stack exchange,提问作者Talita Shiguemoto
相关产品推荐
相关产品推荐

