0

0

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

霞舞

霞舞

发布时间:2025-10-29 14:26:18

|

1041人浏览过

|

来源于php中文网

原创

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

本文详细介绍了如何在pandas dataframe中高效地计算每个列在指定百分位(如20%到80%)范围内的均值。针对直接使用`numpy.quantile`进行条件筛选可能遇到的类型错误,文章提出并详细阐述了利用`dataframe.rank(pct=true)`方法结合布尔索引进行数据过滤的专业解决方案,并通过实例代码展示了其简洁性和有效性,旨在帮助读者掌握处理此类数据统计问题的实用技巧。

在数据分析中,我们经常需要对数据进行统计分析,但有时会遇到需要排除极端值或仅关注特定分布范围内数据的情况。例如,计算每个列在20%到80%百分位范围内的均值,可以有效避免异常值对统计结果的干扰。

问题场景与常见误区

假设我们有一个Pandas DataFrame,包含多列数值数据。我们的目标是为每一列计算其值落在指定百分位范围(例如,第20百分位到第80百分位之间)内的均值。

一个常见的直观想法是首先使用numpy.quantile计算出每列的上下百分位阈值,然后尝试直接用这些阈值对DataFrame进行布尔索引筛选。以下是一个示例及其可能遇到的问题:

import pandas as pd
import numpy as np

# 示例DataFrame
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)

# 计算每列的20%和80%百分位阈值
q20 = np.quantile(df, 0.2, axis=0)
q80 = np.quantile(df, 0.8, axis=0)

print(f"\n每列的20%百分位阈值: {q20}") # 例如:A列2.0, B列26.0
print(f"每列的80%百分位阈值: {q80}") # 例如:A列41.0, B列260.0

# 尝试直接使用阈值进行筛选(这将导致TypeError)
try:
    mask = (df > q20) & (df < q80)
    # df_filtered = df[mask]
    # mean_values = df_filtered.mean()
except TypeError as e:
    print(f"\n尝试直接筛选时捕获到错误: {e}")
    print("错误原因:Pandas DataFrame与NumPy数组进行比较时,如果形状不完全匹配或无法广播,可能导致类型错误。")
    print("这里的q20和q80是形状为(n,)的NumPy数组,而df是DataFrame,直接比较会引发问题。")

当尝试执行 (df > q20) & (df

使用 DataFrame.rank(pct=True) 的专业解决方案

解决上述问题的关键在于将DataFrame中的每个数值转换为其对应的百分位排名。Pandas的 DataFrame.rank(pct=True) 方法正是为此而生。

问问小宇宙
问问小宇宙

问问小宇宙是小宇宙团队出品的播客AI检索工具

下载

df.rank(pct=True) 会计算DataFrame中每个值的百分位排名(即该值在列中的相对位置,介于0到1之间)。这样,我们就可以直接将这些百分位排名与我们希望的百分位范围(如0.2到0.8)进行比较,从而生成一个布尔掩码来筛选数据。

解决方案步骤:

  1. 计算百分位排名: 使用 df.rank(pct=True) 获取DataFrame中每个元素的百分位排名。
  2. 创建布尔掩码: 将百分位排名与目标范围(例如,0.2 到 0.8)进行比较,生成一个布尔型DataFrame作为筛选掩码。
  3. 应用掩码并计算均值: 将生成的掩码应用于原始DataFrame,然后对筛选后的数据计算每列的均值。

示例代码:

import pandas as pd
import numpy as np

# 示例DataFrame
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]
})

# 1. 计算每个值的百分位排名
# df.rank(pct=True) 将DataFrame中的每个数值转换为其在对应列中的百分位排名(0到1之间)
df_ranked_pct = df.rank(pct=True)
print("\nDataFrame中每个值的百分位排名:")
print(df_ranked_pct)

# 2. 创建布尔掩码
# 筛选出排名在20%到80%之间的值
# .ge(0.2) 表示大于等于0.2
# .le(0.8) 表示小于等于0.8
mask = df_ranked_pct.ge(0.2) & df_ranked_pct.le(0.8)
print("\n筛选20%-80%百分位范围的布尔掩码:")
print(mask)

# 3. 应用掩码并计算均值
# 使用布尔掩码对原始DataFrame进行筛选
# 然后对筛选后的结果计算每列的均值
# 注意:未通过筛选的值将变为NaN,计算均值时会自动忽略NaN
out = df[mask].mean()

print("\n每列在20%-80%百分位范围内的均值:")
print(out)

输出结果:

原始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

每列的20%百分位阈值: [ 2. 26.]
每列的80%百分位阈值: [ 41. 260.]

尝试直接筛选时捕获到错误: Cannot compare a Categorical for op __gt__ with type .
If you want to compare values, use 'np.asarray(cat)  other'.
错误原因:Pandas DataFrame与NumPy数组进行比较时,如果形状不完全匹配或无法广播,可能导致类型错误。
这里的q20和q80是形状为(n,)的NumPy数组,而df是DataFrame,直接比较会引发问题。

DataFrame中每个值的百分位排名:
        A         B
0    0.071429  0.071429
1    0.071429  0.357143
2    0.785714  0.178571
3    0.285714  0.178571
4    0.285714  0.785714
5    0.500000  0.285714
6    0.928571  0.357143
7    0.571429  0.428571
8    0.642857  0.500000
9    0.714286  0.642857
10   0.785714  0.785714
11   0.857143  0.857143
12   0.928571  0.928571
13   1.000000  0.428571

筛选20%-80%百分位范围的布尔掩码:
        A      B
0   False  False
1   False   True
2    True  False
3    True  False
4    True   True
5    True   True
6   False   True
7    True   True
8    True   True
9    True   True
10   True   True
11  False  False
12  False  False
13  False   True

每列在20%-80%百分位范围内的均值:
A     12.444444
B    110.000000
dtype: float64

注意事项与总结

  1. rank(pct=True) 的工作原理: df.rank(pct=True) 会对DataFrame中的每一列独立进行排名,并将排名结果转换为0到1之间的百分比值。这意味着每个数值都与其所在列的整体分布相关联,而不是与一个全局的百分位阈值进行比较。
  2. 处理重复值: rank 方法在处理重复值时有多种策略(如method='average'、'min'、'max'等,默认为'average')。pct=True 会基于这些排名策略计算百分比。在大多数情况下,默认的'average'是合适的。
  3. 灵活性: 这种方法非常灵活,你可以轻松修改百分位范围,例如计算10%-90%或5%-95%范围内的均值,只需调整 .ge() 和 .le() 中的阈值即可。
  4. NaN值处理: 当布尔掩码应用于DataFrame时,不满足条件的值会被替换为 NaN。df.mean() 方法在计算均值时会自动跳过 NaN 值,这正是我们想要的行为。如果需要包含 NaN 值或以其他方式处理它们,可能需要额外的步骤。

通过利用 DataFrame.rank(pct=True),我们能够以一种简洁、高效且避免类型错误的方式,精确地筛选出指定百分位范围内的数据,并进行后续的统计分析。这在处理包含异常值或需要聚焦于数据核心分布的场景中尤其有用。

相关专题

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

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

48

2025.12.04

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

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

48

2025.12.04

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

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

447

2023.07.04

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

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

259

2023.08.07

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

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

716

2023.10.16

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

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

498

2024.03.13

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

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

71

2025.09.08

Python 数据分析与可视化
Python 数据分析与可视化

本专题聚焦 Python 在数据分析与可视化领域的核心应用,系统讲解数据清洗、数据统计、Pandas 数据操作、NumPy 数组处理、Matplotlib 与 Seaborn 可视化技巧等内容。通过实战案例(如销售数据分析、用户行为可视化、趋势图与热力图绘制),帮助学习者掌握 从原始数据到可视化报告的完整分析能力。

54

2025.10.14

笔记本电脑卡反应很慢处理方法汇总
笔记本电脑卡反应很慢处理方法汇总

本专题整合了笔记本电脑卡反应慢解决方法,阅读专题下面的文章了解更多详细内容。

1

2025.12.25

热门下载

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

精品课程

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

共32课时 | 2.9万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

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

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