You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决筛选Pandas DataFrame字典列特定键值对时的KeyError

筛选DataFrame中col_x列值为{"key_x":"value1"}的行

我的DataFrame结构如下:

col1col_x
...{"key_x":"value1"}
...None
...{"key_x":"value2"}

需求:选择col_x列中值为{"key_x":"value1"}的所有行,col_x列的值为dict类型或None。

我尝试了以下代码,均触发KeyError: 'key_x':

df.loc[df['col_x']['key_x'] == 'value1']                           # KeyError: 'key_x'
df[~df['col_x'].isnull()].loc[df['col_x']['key_x'] == 'value1']    # KeyError: 'key_x'
df_ok = df[[isinstance(x, dict) and ('key_x' in x.keys()) for x in df.col_x]]
df_ok.loc[df_ok['col_x']['key_x'] == 'value1']                     # KeyError: 'key_x'

正确筛选方法

之前报错的核心原因:df['col_x']是Series对象,直接用df['col_x']['key_x']是试图从Series中获取索引为key_x的元素,而非对每个字典元素提取key,因此触发KeyError。以下是几种可行的解决方法:

方法1:用apply逐行判断(最直观)

filtered_df = df[df['col_x'].apply(lambda x: x is not None and isinstance(x, dict) and x.get('key_x') == 'value1')]

一次性完成非空判断、类型校验和值匹配,避免分步处理可能出现的问题。

方法2:分步筛选

先过滤出col_x为有效字典的行,再提取key_x的值进行匹配:

# 第一步:筛选出col_x是字典类型的行
valid_dict_rows = df[df['col_x'].apply(lambda x: isinstance(x, dict))]
# 第二步:匹配key_x的值
filtered_df = valid_dict_rows[valid_dict_rows['col_x'].apply(lambda x: x['key_x'] == 'value1')]

方法3:利用str.get简化操作

Pandas的str.get方法可以对Series中的字典元素提取key,配合非空判断使用:

filtered_df = df[df['col_x'].notna() & (df['col_x'].str.get('key_x') == 'value1')]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 19:24:52