0

0

Pandas DataFrame:高效筛选所有值均为非负数的组并生成列表

心靈之曲

心靈之曲

发布时间:2025-09-27 23:33:01

|

1031人浏览过

|

来源于php中文网

原创

Pandas DataFrame:高效筛选所有值均为非负数的组并生成列表

本教程详细介绍了如何使用Pandas DataFrame的groupby().all()方法,高效地从数据集中筛选出所有关联值均满足特定条件(如非负数)的组,并将其名称整理成列表。通过实例代码,演示了从数据分组到条件判断再到结果提取的完整流程,帮助用户精准定位符合要求的特定数据子集。

在数据分析中,我们经常需要从大型数据集中根据复杂条件筛选出特定的数据子集。一个常见的需求是识别并提取那些在某个分组(例如“对象”)下,所有关联值都满足特定标准(例如,所有值都为非负数)的组。本教程将详细阐述如何利用pandas库的强大功能,特别是groupby().all()方法,来高效地解决这类问题。

问题描述

假设我们有一个包含日期、对象和值的数据框(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 |
+------------+--------+-------+

我们的目标是编译一个列表,其中包含所有不包含任何负值的“Object”名称。根据上述数据,期望的输出是 ['B', 'D']。

错误尝试分析

初学者可能会尝试使用类似 df["Values"].any() > 0 的表达式来判断。然而,这种方法存在几个问题:

  1. 它直接作用于整个“Values”列,而不是按“Object”分组。
  2. any() 方法通常用于检查序列中是否存在至少一个 True 值,而不是检查所有值是否都满足条件。
  3. 在布尔序列上直接进行 > 0 比较可能导致 KeyError 或不符合预期的结果,因为它不是为这种分组逻辑设计的。

解决方案:使用 groupby().all()

Pandas提供了一个优雅且高效的方法来解决这个问题,即结合使用 groupby() 和 all()。groupby() 用于按指定列进行分组,而 all() 则用于检查每个分组中的所有元素是否都满足某个布尔条件。

步骤详解

  1. 创建布尔条件序列: 首先,我们需要为“Value”列中的每个值创建一个布尔序列,判断其是否为非负数(即大于或等于零)。Pandas的 ge() (greater than or equal to) 方法非常适合此目的。

    import pandas as pd
    import io
    
    # 模拟数据
    data = """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"""
    df = pd.read_csv(io.StringIO(data))
    
    # 检查每个值是否非负
    is_non_negative = df['Value'].ge(0)
    print("布尔条件序列 (is_non_negative):\n", is_non_negative)

    输出示例:

    零一万物开放平台
    零一万物开放平台

    零一万物大模型开放平台

    下载
    布尔条件序列 (is_non_negative):
     0     False
     1      True
     2      True
     3      True
     4      True
     5      True
     6     False
     7      True
     8      True
     9      True
     10     True
     11     True
    Name: Value, dtype: bool
  2. 按对象分组并应用 all(): 接下来,我们将上述布尔序列按“Object”列进行分组,并对每个分组应用 all() 方法。all() 会返回 True,仅当该分组中的所有布尔值都为 True 时;如果其中有任何一个 False,则返回 False。

    # 按 'Object' 分组并检查所有值是否非负
    s = is_non_negative.groupby(df['Object']).all()
    print("\n按对象分组后的非负判断结果 (s):\n", s)

    输出示例:

    按对象分组后的非负判断结果 (s):
     Object
     A    False
     B     True
     C    False
     D     True
    Name: Value, dtype: bool

    从 s 中我们可以清楚地看到,对象 'B' 和 'D' 的所有值都是非负的。

  3. 提取符合条件的“Object”名称: 最后,我们只需从 s 中筛选出值为 True 的索引(即“Object”名称),并将其转换为列表。

    # 提取符合条件的 'Object' 名称并转换为列表
    out = s.index[s].tolist()
    print("\n最终结果列表 (out):\n", out)

    输出:

    最终结果列表 (out):
     ['B', 'D']

完整代码示例

import pandas as pd
import io

# 模拟数据
data = """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"""
df = pd.read_csv(io.StringIO(data))

# 核心逻辑
# 1. 判断每个值是否大于等于0 (非负)
is_non_negative = df['Value'].ge(0)

# 2. 按 'Object' 分组,并对每个分组应用 all(),判断是否所有值都非负
s = is_non_negative.groupby(df['Object']).all()

# 3. 提取结果为 True 的 'Object' 名称并转换为列表
result_list = s.index[s].tolist()

print("原始数据框:\n", df)
print("\n符合条件(所有值非负)的对象列表:\n", result_list)

注意事项

  • ge(0) vs gt(0): ge(0) 表示“大于或等于零”,用于判断非负数。如果你的条件是“严格大于零”,则应使用 gt(0)。
  • all() vs any(): all() 检查组内所有元素是否都满足条件,而 any() 检查组内是否有至少一个元素满足条件。根据具体需求选择合适的方法。
  • 性能: 对于大型数据集,groupby().all() 是一种非常高效的Pandas操作,因为它在C语言级别进行了优化。
  • 多条件筛选: 如果需要基于多个列的组合条件进行筛选,可以在 groupby() 之后应用更复杂的聚合函数或使用 apply() 方法。

总结

通过本教程,我们学习了如何利用Pandas的 groupby().all() 组合方法,从DataFrame中高效地筛选出那些所有关联值都满足特定条件的组。这种方法不仅代码简洁,而且执行效率高,是处理类似数据筛选任务的强大工具。掌握这一技巧将极大地提升你在Pandas数据处理中的能力。

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

379

2023.06.20

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

608

2023.07.25

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

348

2023.08.02

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

255

2023.08.09

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

586

2023.09.05

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

520

2023.09.20

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

632

2023.09.20

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

595

2023.09.22

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

74

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Rust 教程
Rust 教程

共28课时 | 4万人学习

Kotlin 教程
Kotlin 教程

共23课时 | 2.2万人学习

Go 教程
Go 教程

共32课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号