0

0

Pandas高效筛选:基于分组条件提取DataFrame子集

DDD

DDD

发布时间:2025-11-28 14:44:12

|

814人浏览过

|

来源于php中文网

原创

Pandas高效筛选:基于分组条件提取DataFrame子集

本文详细介绍了如何在pandas中,不创建额外辅助列的情况下,根据`groupby`分组聚合的条件来筛选dataframe的子集。核心方法是利用`groupby().transform()`函数,它能将分组计算结果广播回原dataframe的索引,从而实现高效的布尔索引过滤,避免了冗余数据和复杂的合并操作。

在数据分析和处理中,我们经常需要根据复杂的条件来筛选DataFrame中的行。其中一种常见场景是,筛选出那些其所属分组不满足特定聚合条件的行。例如,在一个包含日期、地点和代理人信息的数据集中,我们可能需要找出那些在特定日期和地点,代理人数量超过预设阈值的全部记录。传统方法可能涉及先计算分组聚合值,然后将其合并回原DataFrame,再进行筛选,但这会引入额外的列,有时并不高效。

1. 问题场景与数据准备

假设我们有如下一个DataFrame,记录了不同日期和地点的代理人信息:

import pandas as pd
import io

data = """date|point|agent
2023-10-02|A|agent1
2023-10-02|A|agent2
2023-10-05|B|agent3
2023-10-05|B|agent2
2023-10-02|C|agent1
2023-10-02|C|agent2
2023-10-02|C|agent3
"""
df = pd.read_csv(io.StringIO(data), sep='|')
print("原始DataFrame:")
print(df)

我们的目标是:找出在任何给定date和point组合下,agent数量超过2的那些所有行。

2. 理解 groupby().transform() 的作用

Pandas的groupby()操作通常会伴随着聚合函数(如sum(), count(), mean()等),这些函数会将每个组的数据压缩成一个单一的值,并返回一个行数少于原始DataFrame的新Series或DataFrame。

然而,transform()方法则不同。它在每个组上应用一个函数,但返回一个与原始DataFrame具有相同索引和行数的Series(或DataFrame)。这意味着transform()的结果可以被直接用于原始DataFrame的布尔索引,而无需进行合并操作。

对于本例,我们需要计算每个('point', 'date')组合中agent的唯一数量。transform('nunique')将为原始DataFrame中的每一行返回其所属分组的唯一代理人数量。

倍塔塞司
倍塔塞司

AI职业规划、AI职业测评、定制测评、AI工具等多样化职业类AI服务。

下载

3. 高效筛选解决方案

利用groupby().transform('nunique'),我们可以一步到位地生成一个布尔Series,用于直接筛选DataFrame。

# 1. 计算每个(point, date)分组中agent的唯一数量,并将结果广播回原始DataFrame的索引
agent_counts_per_group = df.groupby(['point', 'date'])['agent'].transform('nunique')

# 2. 基于条件筛选出唯一代理人数量大于2的行
filtered_df = df[agent_counts_per_group > 2]

print("\n筛选结果DataFrame:")
print(filtered_df)

输出结果:

原始DataFrame:
         date point   agent
0  2023-10-02     A  agent1
1  2023-10-02     A  agent2
2  2023-10-05     B  agent3
3  2023-10-05     B  agent2
4  2023-10-02     C  agent1
5  2023-10-02     C  agent2
6  2023-10-02     C  agent3

筛选结果DataFrame:
         date point   agent
4  2023-10-02     C  agent1
5  2023-10-02     C  agent2
6  2023-10-02     C  agent3

正如所见,('2023-10-02', 'C')这个分组有三个代理人(agent1, agent2, agent3),因此所有属于这个分组的行都被成功筛选出来。

4. 总结与注意事项

  • 简洁高效: 这种方法避免了创建临时列,使得代码更加简洁,内存占用更低,尤其适用于大型数据集。
  • 适用场景: transform()非常适合需要将分组聚合结果“映射”回原始DataFrame的每个元素,以进行进一步筛选或计算的场景。
  • 与其他方法的对比:
    • groupby().agg()会返回一个聚合后的DataFrame,其索引是分组键,无法直接用于原始DataFrame的布尔索引。
    • groupby().apply()可以执行更复杂的自定义函数,但通常比transform()效率低,因为它需要将每个组作为独立的DataFrame传递给函数。
  • 性能考量: 对于非常大的数据集,transform()通常是高度优化的,但在某些极端复杂的自定义转换场景下,可能需要评估其性能。

通过熟练运用groupby().transform(),Pandas用户可以更优雅、高效地处理基于分组条件的DataFrame筛选任务,提升数据处理的灵活性和效率。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

71

2025.12.04

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

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

1

2026.01.31

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

198

2023.11.20

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

52

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

40

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

50

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

11

2026.01.31

漫画防走失登陆入口大全
漫画防走失登陆入口大全

2026最新漫画防走失登录入口合集,汇总多个稳定可用网址,助你畅享高清无广告漫画阅读体验。阅读专题下面的文章了解更多详细内容。

13

2026.01.31

php多线程怎么实现
php多线程怎么实现

PHP本身不支持原生多线程,但可通过扩展如pthreads、Swoole或结合多进程、协程等方式实现并发处理。阅读专题下面的文章了解更多详细内容。

1

2026.01.31

热门下载

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

精品课程

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

共578课时 | 54.3万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

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

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