Pandas技术实现:从列中字典列表生成0-1特征列
解决Pandas字典列表转0-1特征列的问题
我来帮你搞定这个设施特征转换的需求!你的思路是对的,只是现有代码里有个小细节没处理好——Amenities列的每个单元格是字典组成的列表,不是单个字典,所以不能直接用.items()遍历,得先拆解列表里的每个字典才行。下面我给你完善代码,同时兼顾效率和你的需求逻辑:
基础版(贴合你的迭代判断逻辑)
这个版本严格按照你要求的「迭代时判断列是否存在,不存在则新建」的逻辑来写:
import pandas as pd # 假设你的DataFrame已经是df,先确保Amenities是列表格式(如果是字符串,需要先解析,后面会说) for i, row in df.iterrows(): amenities_list = row['Amenities'] # 遍历列表里的每个设施字典 for amenity_dict in amenities_list: # 取出设施名称,去掉首尾空格避免重复列(比如"Complex Wifi "和"Complex Wifi") amenity_name = amenity_dict['Description'].strip() # 判断列是否存在 if amenity_name in df.columns: # 列存在,当前行设为1 df.loc[i, amenity_name] = 1 else: # 列不存在,新建列并初始化为0,再把当前行设为1 df[amenity_name] = 0 df.loc[i, amenity_name] = 1 # 可选:把新增的设施列转为整数类型,确保是0/1而不是浮点数 # 先筛选出所有新增的设施列(假设原DataFrame除了Amenities都是其他列) original_columns = df.columns.drop('Amenities') amenity_columns = [col for col in df.columns if col not in original_columns] df[amenity_columns] = df[amenity_columns].astype(int)
优化版(适合大数据量,效率更高)
如果你的DataFrame行数很多,iterrows()会比较慢。推荐先一次性收集所有可能的设施,再批量创建列并赋值,效率提升明显:
import pandas as pd # 第一步:收集所有不重复的设施名称 all_amenities = set() for amenities_list in df['Amenities']: for amenity_dict in amenities_list: amenity_name = amenity_dict['Description'].strip() all_amenities.add(amenity_name) # 第二步:一次性创建所有设施列,初始值设为0 for amenity in all_amenities: df[amenity] = 0 # 第三步:遍历每行,给对应的设施设为1 for idx, amenities_list in enumerate(df['Amenities']): for amenity_dict in amenities_list: amenity_name = amenity_dict['Description'].strip() df.loc[idx, amenity_name] = 1 # 转为整数类型 df[list(all_amenities)] = df[list(all_amenities)].astype(int)
额外注意事项
如果你的Amenities列存储的是字符串格式的列表(比如从CSV/JSON读取时没自动解析),需要先把字符串转成真实的列表:
import ast # 把字符串格式的列表解析成Python列表 df['Amenities'] = df['Amenities'].apply(ast.literal_eval)
效果示例
处理后你的DataFrame会新增每个设施对应的列,比如Basketball Court(s)、Bike Rack / Bike Storage等,有该设施的行对应值为1,没有的为0,完美符合你要的0-1型特征。
内容的提问来源于stack exchange,提问作者kms
相关产品推荐
相关产品推荐

