0

0

Pandas DataFrame:高效计算指定分位数范围内的列均值

碧海醫心

碧海醫心

发布时间:2025-10-28 12:18:01

|

721人浏览过

|

来源于php中文网

原创

Pandas DataFrame:高效计算指定分位数范围内的列均值

本教程详细阐述了如何在pandas dataframe中高效计算各列的均值,同时仅考虑数值落在指定分位数(如20%到80%)范围内的元素。我们将重点介绍利用df.rank(pct=true)方法创建精确的布尔掩码进行数据过滤,从而避免直接分位数比较可能遇到的类型或维度不匹配问题,确保计算结果的准确性和代码的健壮性。

在数据分析实践中,我们经常需要对数据集进行统计分析,例如计算平均值。然而,为了提高统计的鲁棒性或关注特定数据范围内的趋势,有时需要排除极端值或仅考虑落在特定分位数区间内的数据。例如,计算各列的均值,但只包括那些值位于20%到80%分位数之间的数据。本教程将介绍一种简洁而高效的方法来解决这一问题。

核心方法:使用 rank(pct=True) 进行分位数过滤

Pandas DataFrame的rank()方法是一个强大的工具,它可以为DataFrame中的每个元素计算其在所属列中的排名。当pct=True时,它会返回每个值在其列中的百分比排名(即分位数排名),范围从0到1。利用这一特性,我们可以轻松地构建一个布尔掩码来筛选出落在指定分位数范围内的值。

基本原理:

  1. 对于DataFrame中的每个数值,计算其在对应列中的百分比排名。
  2. 根据所需的下限和上限分位数(例如0.2和0.8),检查每个百分比排名是否位于这个区间内。
  3. 使用生成的布尔掩码来筛选原始DataFrame,只保留符合条件的值。
  4. 对筛选后的DataFrame计算各列的均值。

详细步骤与代码示例

我们将通过一个具体的例子来演示如何实现这一过程。

步骤 1: 准备数据

首先,创建一个示例Pandas DataFrame,其中包含需要进行分析的数值列。

import pandas as pd
import numpy as np

df = pd.DataFrame({
    "A": [1, 1, 20, 2, 2, 3, 50, 7, 8, 15, 20, 35, 50, 70],
    "B": [10, 100, 20, 20, 200, 30, 50, 70, 80, 150, 200, 350, 500, 700]
})
print("原始 DataFrame:")
print(df)

输出:

原始 DataFrame:
    A    B
0   1   10
1   1  100
2  20   20
3   2   20
4   2  200
5   3   30
6  50   50
7   7   70
8   8   80
9  15  150
10 20  200
11 35  350
12 50  500
13 70   70

步骤 2: 计算分位数排名

使用df.rank(pct=True)计算DataFrame中每个元素在其列中的百分比排名。

# 计算每个值在其列中的百分比排名
percentile_ranks = df.rank(pct=True)
print("\n各列的百分比排名:")
print(percentile_ranks)

输出(部分):

各列的百分比排名:
      A         B
0   0.071429  0.071429
1   0.071429  0.500000
2   0.678571  0.178571
3   0.214286  0.178571
4   0.214286  0.785714
...

从输出可以看出,每个值都被赋予了一个介于0到1之间的排名,表示它在所属列中的相对位置。

吐槽大师
吐槽大师

吐槽大师(Roast Master) - 终极 AI 吐槽生成器,适用于 Instagram,Facebook,Twitter,Threads 和 Linkedin

下载

步骤 3: 构建过滤掩码

现在,我们可以根据所需的分位数范围(例如20%到80%)来构建一个布尔掩码。使用ge()(大于或等于)和le()(小于或等于)方法来检查百分比排名是否在指定区间内。

lower_quantile = 0.2
upper_quantile = 0.8

# 构建布尔掩码
mask = percentile_ranks.ge(lower_quantile) & percentile_ranks.le(upper_quantile)
print(f"\n过滤掩码 (分位数范围: {lower_quantile*100}% - {upper_quantile*100}%):")
print(mask)

输出(部分):

过滤掩码 (分位数范围: 20.0% - 80.0%):
        A      B
0   False  False
1   False   True
2    True  False
3    True  False
4    True   True
...

这个mask是一个与原始DataFrame形状相同的布尔DataFrame,True表示对应位置的值在目标分位数范围内,False则表示不在。

步骤 4: 应用掩码并计算均值

最后,将这个布尔掩码应用到原始DataFrame上,然后计算过滤后数据的各列均值。未通过筛选的值将变为NaN,在计算均值时会自动忽略。

# 应用掩码并计算均值
filtered_means = df[mask].mean()
print(f"\n过滤后各列的均值 (分位数范围: {lower_quantile*100}% - {upper_quantile*100}%):")
print(filtered_means)

输出:

过滤后各列的均值 (分位数范围: 20.0% - 80.0%):
A     12.444444
B    110.000000
dtype: float64

完整代码块:

将上述步骤整合到一起,得到一个简洁高效的解决方案。

import pandas as pd
import numpy as np

# 准备数据
df = pd.DataFrame({
    "A": [1, 1, 20, 2, 2, 3, 50, 7, 8, 15, 20, 35, 50, 70],
    "B": [10, 100, 20, 20, 200, 30, 50, 70, 80, 150, 200, 350, 500, 700]
})

lower_quantile = 0.2
upper_quantile = 0.8

# 一步到位:计算分位数排名,构建掩码,应用掩码并计算均值
result_mean = df[df.rank(pct=True).ge(lower_quantile) & \
                 df.rank(pct=True).le(upper_quantile)].mean()

print(f"\n最终结果:过滤后各列的均值 (分位数范围: {lower_quantile*100}% - {upper_quantile*100}%):")
print(result_mean)

注意事项

  1. rank()方法的参数:
    • method: 当存在相同值时如何排名。默认是average(平均排名),其他选项包括min, max, first, dense。选择合适的method取决于你对相同值排名的具体需求。对于分位数过滤,average通常是合理的选择。
    • na_option: 如何处理NaN值。默认是keep(保留NaN),其他选项有top(将NaN视为最大值)和bottom(将NaN视为最小值)。在计算均值时,NaN通常会被忽略,因此默认设置通常是可接受的。
  2. 性能考虑: 对于非常大的DataFrame,rank(pct=True)可能会消耗较多的内存和计算时间,因为它需要对每个列进行排序。在处理海量数据时,可能需要考虑更优化的分布式计算框架(如Dask)或采样方法。
  3. 分位数定义: rank(pct=True)计算的是严格的百分比排名,即某个值小于或等于多少百分比的数据。这与np.quantile或df.quantile可能使用的插值方法略有不同,但对于大多数过滤场景而言,这种基于排名的过滤是完全有效的。

总结

通过利用Pandas DataFrame.rank(pct=True)方法,我们可以简洁而高效地实现对各列数据在指定分位数范围内进行过滤,并计算其均值。这种方法避免了手动计算每个列的分位数阈值并逐列应用筛选的繁琐过程,提供了一个统一且易于理解的解决方案,极大地提高了数据处理的效率和代码的可读性。在需要进行鲁棒性统计分析或关注数据核心趋势时,这种技术尤为实用。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

409

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

251

2023.10.07

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

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

80

2025.12.04

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

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

33

2026.01.31

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

25

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

44

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

177

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

50

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

92

2026.03.09

热门下载

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

精品课程

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

共58课时 | 6万人学习

ASP 教程
ASP 教程

共34课时 | 5.9万人学习

Vue3.x 工具篇--十天技能课堂
Vue3.x 工具篇--十天技能课堂

共26课时 | 1.6万人学习

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

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