如何在Python字典列表中按键值查询同字典另一键值?pandas lookup报KeyError
报错核心原因
之前编写的代码触发KeyError,是三处实现细节错误共同导致的:
- pandas的方括号索引语法,传入的参数必须是DataFrame的列名,代码中传入的
"Nitrogen"是列内部的单元格值,并非实际存在的列名(真实列名为"Name"),pandas尝试读取不存在的列时就会抛出KeyError。 lookup()方法要求传入两个等长的序列,分别对应需要查询的行位置、列位置标签,原代码没有正确生成匹配值对应的行索引、目标查询列的标签,传参逻辑完全不符合方法的使用要求。- 手动指定
columns参数时存在列名不匹配问题:原JSON数据中的列键为"Ref.",手动传入的列名是"Ref",就算前面的问题解决了,读取出的对应列也会是空值。
可落地的实现方案
方案1:纯原生Python实现,无额外依赖
如果仅需要完成键值匹配查询,不需要做复杂的表格分析,直接操作字典列表的运行效率更高,也不存在pandas版本兼容问题。
实现逻辑很简单:
- 直接加载JSON文件为字典列表
- 遍历列表中的每一个字典,当匹配键的取值和输入值一致时,返回目标键的对应值
示例代码:
import json # 加载JSON文件为字典列表 with open("file.json", "r", encoding="utf-8") as f: data = json.load(f) def query_value(data: list[dict], match_key: str, match_val, target_key: str): # 遍历找到匹配条目,返回目标键值 for item in data: if item[match_key] == match_val: return item[target_key] # 未匹配到结果时返回空值 return None # 示例:查询Name为Nitrogen对应的Formula值 query_result = query_value(data, match_key="Name", match_val="Nitrogen", target_key="Formula") print(query_result) # 输出 N2
方案2:使用pandas实现查询
如果后续需要基于表格做更多数据分析,可使用pandas的布尔索引实现匹配,这是目前pandas官方推荐的查询方式,比已被逐步废弃的lookup()方法更稳定。
读取JSON时不需要手动指定列名,pandas会自动识别JSON中的键作为列名,避免手动写列名导致的匹配错误。
示例代码:
import pandas as pd # 直接读取JSON文件生成DataFrame df = pd.read_json("file.json") # 布尔索引过滤匹配行,取目标列值 query_result = df.loc[df["Name"] == "Nitrogen", "Formula"].iloc[0] print(query_result) # 输出 N2
实现注意事项
- 如果同一个匹配值对应多条记录,去掉
.iloc[0]就可以返回所有匹配结果组成的Series对象 - 若需要兼容旧版本pandas使用
lookup()方法,需要正确生成行索引和列标签的匹配序列,正确写法为:
注意:pandas 2.0及以上版本已经完全移除了match_row_index = df.index[df["Name"] == "Nitrogen"] query_result = df.lookup(match_row_index, ["Formula"] * len(match_row_index))lookup()方法,不推荐在新代码中使用。
内容的提问来源于stack exchange,提问作者andreas2010
相关产品推荐
相关产品推荐

