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

Pandas:检查存储为列表的列中是否存在指定值

问题分析与解决方案

这个问题的核心是你误解了pandas中str访问器和isin()方法的适用场景——你的STATUS列存储的是列表对象,而不是单个字符串,所以原代码的逻辑完全走偏了。

为什么原代码返回全False?

  • df['STATUS'].str.upper():pandas的str访问器是为单个字符串类型的单元格设计的。当单元格是列表时,这个操作不会遍历列表内的元素转大写,反而会返回NaN(或无意义的结果),根本没起到你想要的作用。
  • .isin(['RECEIVED']):这个方法是判断整个单元格的值(也就是那个列表)是否存在于给定的集合中。显然一个列表不可能等于字符串'RECEIVED',所以所有结果都是False。

可行解决方案

方案1:apply()快速处理(适合中小规模数据)

如果需要统一转大写后检查目标元素,用lambda遍历每个列表:

df['HAS_RECEIVED'] = df['STATUS'].apply(lambda x: 'RECEIVED' in [s.upper() for s in x])

如果你的原始数据里的STATUS元素已经是大写(比如示例里的内容),可以简化:

df['HAS_RECEIVED'] = df['STATUS'].apply(lambda x: 'RECEIVED' in x)

方案2:explode()+groupby()向量化处理(适合大规模数据集)

当数据量很大时,apply()的效率会偏低,用pandas的向量化操作更高效:

# 展开列表为单独行 → 转大写 → 判断是否匹配目标值 → 按原索引聚合(只要有一个True就返回True)
exploded_df = df['STATUS'].explode().str.upper().eq('RECEIVED').reset_index()
df['HAS_RECEIVED'] = exploded_df.groupby('index')[0].any()

预期结果

执行任意方案后,你会得到符合预期的输出:

STATUS                HAS_RECEIVED
1  [REQUESTED, RECEIVED] True
2  [XYZ]                 False
3  [RECEIVED]            True

内容的提问来源于stack exchange,提问作者Tom J Muthirenthi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:27:21