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

如何从DataFrame中提取无任何负值的对象列表?

提取无负值对应Object的解决方案

问题描述

需要从DataFrame中提取所有对应Value列无任何负值的Object列表,示例DataFrame如下:

+------------+--------+-------+
|  Date      | Object | Value |
+------------+--------+-------+
| 01/05/2010 | A      |   -10 |
| 01/05/2010 | A      |     5 |
| 01/05/2010 | A      |    20 |
| 01/05/2010 | B      |     5 |
| 01/05/2010 | B      |    10 |
| 01/05/2010 | B      |    31 |
| 01/05/2010 | C      |    -2 |
| 01/05/2010 | C      |     5 |
| 01/05/2010 | C      |    10 |
| 01/05/2010 | D      |    19 |
| 01/05/2010 | D      |    10 |
| 01/05/2010 | D      |    20 |
+------------+--------+-------+

期望结果为['B', 'D'],但执行df["Values"].any() > 0时出现KeyError: False错误。

错误原因分析

  • 列名拼写错误:DataFrame中列名是Value,但代码里写的是Values(多了一个s),直接导致找不到目标列。
  • 逻辑与用法错误:any()方法返回布尔值,用布尔值作为索引去取DataFrame的列,自然会触发KeyError,因为DataFrame中不存在名为False的列。同时你的逻辑方向错误——需求是筛选没有任何负值的Object,而非只要存在正值就符合条件。

正确实现方法

方法1:分组后筛选

通过groupby按Object分组,检查每组的Value是否全部大于等于0,最后提取符合条件的Object名称:

# 筛选所有Value列无负值的Object
valid_objects = df.groupby('Object').filter(lambda x: (x['Value'] >= 0).all())['Object'].unique().tolist()
print(valid_objects)  # 输出: ['B', 'D']

方法2:分组聚合后筛选

先分组聚合得到每个Object是否存在负值,再过滤出无负值的项:

# 计算每个Object是否存在负值
has_negative = df.groupby('Object')['Value'].apply(lambda x: (x < 0).any())
# 筛选出无负值的Object
valid_objects = has_negative[~has_negative].index.tolist()
print(valid_objects)  # 输出: ['B', 'D']

方法3:排除法筛选

先找出所有存在负值的Object,再从总Object列表中排除这些项:

# 找出所有有负值的Object
invalid_objects = df[df['Value'] < 0]['Object'].unique()
# 从所有Object中排除无效项
valid_objects = [obj for obj in df['Object'].unique() if obj not in invalid_objects]
print(valid_objects)  # 输出: ['B', 'D']

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 15:35:06