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

从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 ''
)

这个写法做了两层防护:

  1. 先判断x是否为列表,避免非列表值导致的遍历错误
  2. 遍历列表时先确认元素y是字典,再检查colour是否为Red,避免非字典元素触发报错
  3. 如果找不到匹配的字典,返回空字符串(你也可以改成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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 20:27:39