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之间的排名,表示它在所属列中的相对位置。

QIMI奇觅
QIMI奇觅

美图推出的游戏行业广告AI制作与投放一体化平台

下载

步骤 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

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

331

2023.08.11

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

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

236

2023.10.07

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

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

70

2025.12.04

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

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

1

2026.01.31

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

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

1

2026.01.31

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

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

2

2026.01.31

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

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

1

2026.01.31

php如何运行环境
php如何运行环境

本合集详细介绍PHP运行环境的搭建与配置方法,涵盖Windows、Linux及Mac系统下的安装步骤、常见问题及解决方案。阅读专题下面的文章了解更多详细内容。

0

2026.01.31

php环境变量如何设置
php环境变量如何设置

本合集详细讲解PHP环境变量的设置方法,涵盖Windows、Linux及常见服务器环境配置技巧,助你快速掌握环境变量的正确配置。阅读专题下面的文章了解更多详细内容。

0

2026.01.31

热门下载

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

精品课程

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

共58课时 | 4.4万人学习

Pandas 教程
Pandas 教程

共15课时 | 1.0万人学习

ASP 教程
ASP 教程

共34课时 | 4.2万人学习

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

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