如何从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
相关产品推荐
相关产品推荐

