利用Pandas高效提取DataFrame中符合条件的关联数据

胖丽君_4353

胖丽君_4353

2025-11-20

802人浏览

原创

利用pandas高效提取dataframe中符合条件的关联数据

本文将深入探讨如何在Pandas DataFrame中高效地执行向量化操作,特别是针对多列数据,根据特定条件筛选并提取关联数据(如患者ID)。通过结合布尔索引和列表推导式,我们将展示如何避免低效的循环,实现高性能的数据处理,从而轻松获取按列分组的条件性数据列表。

Pandas作为Python中强大的数据处理库,其核心优势之一在于提供了丰富的向量化操作,能够显著提升数据处理效率。在实际数据分析场景中,我们经常需要根据DataFrame中某一列或多列的条件,来筛选并提取与之关联的其他列数据。本教程将以一个具体的案例为例,详细介绍如何利用Pandas的向量化能力,高效地实现这一目标。

数据准备与基础向量化操作

首先,我们创建一个示例DataFrame,其中包含患者ID和多个测量值(S1至S5)。

import pandas as pd

columns = ['S1', 'S2', 'S3', 'S4', 'S5']

df = pd.DataFrame({'Patient':['p1', 'p2', 'p3', 'p4', 'p5', 'p6', 'p7', 'p8', 'p9', 'p10'],
                   'S1':[0.7, 0.3, 0.5, 0.8, 0.9, 0.1, 0.9, 0.2, 0.6, 0.3],
                   'S2':[0.2, 0.3, 0.5, 0.4, 0.9, 0.1, 0.9, 0.7, 0.4, 0.3],
                   'S3':[0.6, 0.3, 0.5, 0.8, 0.9, 0.8, 0.9, 0.3, 0.6, 0.3],
                   'S4':[0.2, 0.3, 0.7, 0.8, 0.9, 0.1, 0.9, 0.7, 0.3, 0.3 ],
                   'S5':[0.9, 0.8, 0.5, 0.8, 0.9, 0.7, 0.2, 0.7, 0.6, 0.3 ]})

print("原始DataFrame:")
print(df)

在处理这类数据时,一些基础的向量化操作非常常见。例如,我们可以轻松地统计每列中满足特定条件的单元格数量,或者计算满足条件的单元格之和。

  • 统计每列中值大于等于0.5的单元格数量:

    arr1 = df[columns].ge(0.5).sum().to_numpy()
    print("\n每列中值>=0.5的单元格数量:", arr1)
    # 输出示例: 每列中值>=0.5的单元格数量: [7 4 7 5 7]

    这里,df[columns].ge(0.5) 会生成一个布尔型的DataFrame,表示每个单元格是否大于等于0.5。接着,.sum() 会对每列的布尔值进行求和(True被视为1,False被视为0),从而得到满足条件的数量。

  • 计算每列中值大于等于0.5的单元格之和:

    macOS UI 自动化技能包 —— 用 Python 控制你的 Mac
    macOS UI 自动化技能包 —— 用 Python 控制你的 Mac

    让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限

    下载
    # 注意:为了避免NaN影响求和,此方法会先筛选出符合条件的值再求和
    arr2 = df[df[columns] >= 0.5][columns].sum().to_numpy()
    print("每列中值>=0.5的单元格之和:", arr2)
    # 输出示例: 每列中值>=0.5的单元格之和: [4.9 3.  5.2 4.1 5.3]

    此操作通过布尔索引 df[df[columns] >= 0.5] 首先筛选出满足条件的单元格,然后对这些单元格进行求和。未满足条件的单元格在求和时会被忽略(通常表现为NaN,但sum()会跳过NaN)。

按列条件提取关联患者列表

现在,我们面临一个更具体的任务:对于每一列(S1到S5),我们希望获取所有值大于等于0.5的患者ID列表。例如,对于S1列,如果p1的S1值是0.7(>=0.5),那么p1就应该出现在S1对应的患者列表中。

为了高效地实现这一目标,我们可以利用Pandas的布尔索引和列表推导式。

patient_lists_by_column = [df.Patient[df[col] >= 0.5].to_list() for col in columns]

print("\n按列条件筛选的患者列表:")
for i, col in enumerate(columns):
    print(f"  {col}: {patient_lists_by_column[i]}")

代码解析:

  1. for col in columns: 这是一个列表推导式,它会遍历我们定义的 columns 列表中的每一个列名('S1', 'S2', ...)。
  2. df[col] >= 0.5: 在每一次迭代中,这会为当前列 col 生成一个布尔型Series。例如,当 col 是 'S1' 时,它会返回一个Series,指示 df['S1'] 中哪些行的值大于等于0.5。
  3. df.Patient[...]: 这是Pandas中强大的布尔索引功能。我们将上一步生成的布尔型Series作为索引传递给 df.Patient。Pandas会自动筛选出 df.Patient 列中对应布尔值为 True 的行。
  4. .to_list(): 最后,将筛选出的 Patient Series 转换为一个标准的Python列表。

输出示例:

按列条件筛选的患者列表:
  S1: ['p1', 'p3', 'p4', 'p5', 'p7', 'p9']
  S2: ['p3', 'p5', 'p7', 'p8']
  S3: ['p1', 'p3', 'p4', 'p5', 'p6', 'p7', 'p9']
  S4: ['p3', 'p4', 'p5', 'p7', 'p8']
  S5: ['p1', 'p2', 'p3', 'p4', 'p5', 'p6', 'p8', 'p9']

注意事项与最佳实践

  • 性能优势: 这种结合布尔索引和列表推导式的方法,相比于使用显式 for 循环逐行检查和追加数据,具有显著的性能优势。Pandas的底层实现是C语言编写的,向量化操作能够充分利用CPU的并行计算能力,特别是在处理大规模数据集时,性能提升更为明显。
  • 代码可读性: 这种写法简洁明了,易于理解,符合Pythonic的编程风格。它清晰地表达了“对每一列应用条件并提取患者”的意图。
  • 灵活性: 布尔索引非常灵活,你可以组合多个条件(例如 (df[col] >= 0.5) & (df[col]
  • 输出格式: 如果需要获取唯一的患者ID,可以在 .to_list() 之前或之后使用 set(),例如 [list(set(df.Patient[df[col] >= 0.5])) for col in columns]。如果需要将结果存储为字典,可以将列表推导式的结果与列名结合,例如 dict(zip(columns, patient_lists_by_column))。

总结

本教程展示了如何利用Pandas的向量化能力,特别是布尔索引和列表推导式,来高效地从DataFrame中根据列条件提取关联数据。掌握这些技术不仅能提高代码的执行效率,还能使数据处理逻辑更加清晰和简洁。在处理大规模数据集时,优先考虑使用Pandas提供的向量化操作是实现高性能数据分析的关键。通过灵活运用这些工具,您可以更高效、更优雅地解决各种复杂的数据筛选和提取问题。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

2025.12.04

340

15

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

2026.01.31

252

21

Python数据分析与Pandas高级实战
Python数据分析与Pandas高级实战

本专题围绕 Python 数据分析展开,系统讲解 Pandas 的高级用法,包括数据清洗、透视表、时间序列分析以及多表合并与分组操作。通过实战案例,帮助开发者掌握高效处理与分析数据的方法,提高数据处理效率与分析能力。

2026.04.13

691

25

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

2026.10.28

20

16

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

2026.10.28

0

15

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

2026.10.28

0

10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

120

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

60

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

60

15

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习