You need to enable JavaScript to run this app. 如何在Python字典列表中按键值查询同字典另一键值?pandas lookup报KeyError
优惠活动
大模型
产品
解决方案
定价
更多

如何在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()方法,需要正确生成行索引和列标签的匹配序列,正确写法为:
    match_row_index = df.index[df["Name"] == "Nitrogen"]
    query_result = df.lookup(match_row_index, ["Formula"] * len(match_row_index))
    
    注意:pandas 2.0及以上版本已经完全移除了lookup()方法,不推荐在新代码中使用。

内容的提问来源于stack exchange,提问作者andreas2010

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.02 02:57:04