从DataFrame的字典列表列label_dict中提取Red对应value值时出现报错的技术问询
解决从字典列表中提取指定colour对应value的问题
先来说说你两种方法出错的原因,再给你可靠的解决方案:
为什么你的方法报错?
方法二的核心错误
你在方法二中写了x.get('Red'),但这里的x是字典组成的列表,不是单个字典!列表根本没有get()方法,所以必然会抛出AttributeError: 'list' object has no attribute 'get',这是逻辑上的错误。
方法一可能的报错原因
方法一的思路其实是对的,但如果你的label_dict列存在以下情况,就会报错:
- 某行的值不是列表(比如
None) - 列表里混了非字典类型的元素(比如字符串、数字)
这两种情况都会导致遍历过程中调用y.get('colour')时出错,因为非字典对象没有get()方法。
可靠的解决方案
我给你两种写法,一种是更健壮的lambda版本,另一种是更直观的自定义函数版本,你可以根据需求选择:
方案1:健壮的Lambda写法
df['Red'] = df['label_dict'].apply( lambda x: next((y.get('value', '') for y in x if isinstance(y, dict) and y.get('colour') == 'Red'), '') if isinstance(x, list) else '' )
这个写法做了两层防护:
- 先判断
x是否为列表,避免非列表值导致的遍历错误 - 遍历列表时先确认元素
y是字典,再检查colour是否为Red,避免非字典元素触发报错 - 如果找不到匹配的字典,返回空字符串(你也可以改成
None,根据需求调整)
方案2:更易维护的自定义函数
如果你觉得lambda写起来太紧凑,不好调试,可以用自定义函数:
def extract_red_value(label_list): # 先判断输入是否为列表,不是直接返回空 if not isinstance(label_list, list): return '' # 遍历列表中的每个字典 for item in label_list: # 确保元素是字典,且colour为Red if isinstance(item, dict) and item.get('colour') == 'Red': # 返回对应的value,没有value键就返回空 return item.get('value', '') # 遍历完没找到,返回空 return '' df['Red'] = df['label_dict'].apply(extract_red_value)
测试验证
用你提供的示例数据测试,最终df['Red']会得到如下结果:
| Red |
|---|
| 20 |
| 15 |
| 45 |
完全符合你的需求:存在Red就提取对应的value,不存在就返回空字符串。
内容的提问来源于stack exchange,提问作者james
相关产品推荐
相关产品推荐

