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

碧海醫心
发布: 2025-10-28 12:18:01
原创
696人浏览过

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

算家云
算家云

高效、便捷的人工智能算力服务平台

算家云37
查看详情 算家云

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

以上就是Pandas DataFrame:高效计算指定分位数范围内的列均值的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

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