Pandas lookup报错One or more row labels was not found缺失值返回Not Available方案
报错的根本原因是df2的Origin列存在df1中不存在的列标签(如示例中的City D),pandas原生lookup方法遇到不存在的标签会直接抛出KeyError: 'One or more row labels was not found',不支持自定义缺省返回值,可通过以下方案实现需求:
方案1:reindex预先补全缺失列(矢量化操作,性能优先,适合大数据量)
先对df1的列进行重索引,覆盖df2所有Origin取值,不存在的列默认填充Not Available,再做匹配取值:
# 设置Destcode为索引 df1_idx = df1.set_index('Destcode') # 补全列范围,缺失列默认填充Not Available df1_reindex = df1_idx.reindex(columns=df2['Origin'].unique(), fill_value='Not Available') # 匹配取值,无报错 df2['Cek Available'] = df1_reindex.lookup(df2['Destcode'], df2['Origin'])
运行后得到的df2结果如下:
| Destcode | Origin | Cek Available |
|---|---|---|
| C | City A | Available |
| F | City C | Available |
| G | City A | Available |
| D | City B | Available |
| E | City D | Not Available |
如果使用的是pandas 1.2.0及以上版本(lookup已被标记为弃用),可以用以下写法替代lookup,效果完全一致:
df2['Cek Available'] = df1_reindex.stack().loc[tuple(zip(df2['Destcode'], df2['Origin']))].values
方案2:逐行判断(逻辑直观,适合小数据量)
数据量较小时可以用逐行判断的方式,逻辑更易理解:
def get_availability(row): # 列和行标签都存在才取值,否则返回缺省值 if row['Origin'] in df1.columns and row['Destcode'] in df1['Destcode'].values: return df1.loc[df1['Destcode'] == row['Destcode'], row['Origin']].iloc[0] return 'Not Available' df2['Cek Available'] = df2.apply(get_availability, axis=1)
内容的提问来源于stack exchange,提问作者Nipo Rianja
相关产品推荐
相关产品推荐

