如何从DataFrame字典类型列中按条件提取指定键值?
Pandas提取字典列中指定值的正确方法
问题场景
现有一个包含NAME、VAL1、VAL2、COST四列的Pandas DataFrame,其中COST列的取值为字典类型,数据如下:
NAME VAL1 VAL2 COST ---------------------------------------------------------------------------- BACD 259.35 267.00 {'COST[2]': [256.12], 'COST[5]': [257.72], 'COST[16]': [266.3]} BACD 256.00 257.95 {'COST[2]': [255.27], 'COST[5]': [257.91], 'COST[16]': [266.3]} BACD 257.90 262.00 {'COST[2]': [258.15], 'COST[5]': [258.82], 'COST[16]': [266.3]} BACD 260.10 261.40 {'COST[2]': [260.32], 'COST[5]': [257.75], 'COST[16]': [266.3]} BACD 260.45 264.90 {'COST[2]': [261.58], 'COST[5]': [258.83], 'COST[16]': [266.3]}
需求目标
提取COST列中'COST[5]'对应的值,得到如下输出:
NAME VAL2 COST ----------------------- BACD 267.00 257.72 BACD 257.95 257.91 BACD 262.00 258.82 BACD 261.40 257.75 BACD 264.90 258.83
错误原因
你尝试的语句无法工作,核心问题在于:
df.COST=='COST[5]'是把整个字典对象和字符串'COST[5]'做等值比较,完全不匹配,导致筛选结果为空- 没有正确提取字典中
'COST[5]'对应的列表值,也未处理该值是列表的结构
正确解法
方法一:使用apply遍历提取
# 筛选NAME为BACD的行,提取基础列 result = df[df['NAME'] == 'BACD'][['NAME', 'VAL2']].copy() # 提取COST字典中COST[5]对应的列表第一个元素 result['COST'] = df[df['NAME'] == 'BACD']['COST'].apply(lambda x: x['COST[5]'][0]) print(result)
方法二:使用Pandas字符串访问器(Pandas 0.25+支持)
# 筛选目标行并提取基础列 result = df[df['NAME'] == 'BACD'][['NAME', 'VAL2']] # 通过str访问字典键,再提取列表第一个元素 result['COST'] = df['COST'].str['COST[5]'].str[0] print(result)
两种方法都能输出符合需求的结果。
内容的提问来源于stack exchange,提问作者Kamal Anand
相关产品推荐
相关产品推荐

