Python中在DataFrame两列检索值时触发ValueError问题排查
排查Pandas数据清洗中的ValueError问题
问题场景
我在用Python做数据清洗,要识别Excel导入的Pandas DataFrame里的过时条目。输入文件有place_new、inst_name等列,这两列里随机混着本该属于place_name列的地名,我需要从places_new列表里检查这两列的地名匹配情况。运行原代码后触发错误:
ValueError: Columns must be same length as key
错误原因
原代码中p_add是筛选后的DataFrame子集(行数远少于原df),直接将它和原df的place_name列做字符串拼接时,会因为两个序列长度不匹配触发报错——Pandas要求拼接的对象必须保持行数一致。另外原代码的筛选逻辑用&要求两列同时包含目标地名,可能不符合实际需求,且未处理空值场景。
修正后的代码
# 先处理place_name列的空值,转为字符串避免拼接错误 f['place_name'] = f['place_name'].fillna('').astype(str) # 遍历places_new中的每个地名,匹配并追加到place_name列 for p in places_new: print(p) try: # 生成掩码:place_new包含p 或者 inst_name包含p(按需可改为&表示同时满足) mask = f["place_new"].str.contains(p, na=False) | f["inst_name"].str.contains(p, na=False) # 对匹配到的行,追加地名到place_name(空值时直接赋值p) f.loc[mask, 'place_name'] = f.loc[mask, 'place_name'].apply(lambda x: f"{x}/{p}" if x else p) print(f[mask]) # 打印本次匹配到的行 except KeyError as e: print(f"Key Error: {e}") continue print(f)
关键修改说明
- 用
fillna('')处理place_name的空值,避免拼接时出现None字符串 - 替换
map+lambda为str.contains,更简洁且支持空值处理(na=False将空值标记为不匹配) - 用
loc精准定位匹配到的行,只对这些行执行拼接操作,保证操作对象长度一致 - 匹配逻辑改为
|(或),如果你的需求是两列必须同时包含目标地名,改回&即可
内容的提问来源于stack exchange,提问作者OnceUponATime
相关产品推荐
相关产品推荐

