Python中匹配dataframe与列表查询数值时如何处理缺失匹配项
解决方案
有两种常见实现方式,优先推荐向量化方案,性能远高于循环遍历,尤其适合你的大型dataframe场景:
方案1:pandas映射方案(推荐)
先基于locations和Value1构造映射关系,直接对目标地点列表批量匹配,缺失值统一填充默认值即可:
# 构造地点到Value1的映射 loc_map = df.set_index('locations')['Value1'] # 替换为你需要的默认值,比如0、None等 default_value = 0 # 如果你的地点列表是DataFrame/Series格式: p = List['Location'].map(loc_map).fillna(default_value).tolist() # 如果你的地点列表是普通Python列表: import pandas as pd p = pd.Series(你的地点列表).map(loc_map).fillna(default_value).tolist()
方案2:修改原有循环
如果要保留你原来的循环写法,只要加空值判断或者异常捕获即可:
写法A:提前判断匹配结果是否为空
p = [] default_value = 0 for loc in List['Location']: match_res = df.loc[df['locations'] == loc, 'Value1'] if not match_res.empty: p.append(match_res.item()) else: p.append(default_value)
写法B:异常捕获
p = [] default_value = 0 for loc in List['Location']: try: p.append(df.loc[df['locations'] == loc, 'Value1'].item()) except ValueError: # 无匹配结果时走该分支 p.append(default_value)
原代码报错原因:当地点不存在时,
df.loc返回的是空Series,调用.item()方法会抛出ValueError: can only convert an array of size 1 to a Python scalar错误,以上方案都是针对这个问题做的兼容处理。
内容的提问来源于stack exchange,提问作者Bart wolker
相关产品推荐
相关产品推荐

