新闻中心
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) 方法正是为此而生。
Pinokio
Pinokio是一款开源的AI浏览器,可以安装运行各种AI模型和应用
232
查看详情
df.rank(pct=True) 会计算DataFrame中每个值的百分位排名(即该值在列中的相对位置,介于0到1之间)。这样,我们就可以直接将这些百分位排名与我们希望的百分位范围(如0.2到0.8)进行比较,从而生成一个布尔掩码来筛选数据。
解决方案步骤:
- 计算百分位排名: 使用 df.rank(pct=True) 获取DataFrame中每个元素的百分位排名。
- 创建布尔掩码: 将百分位排名与目标范围(例如,0.2 到 0.8)进行比较,生成一个布尔型DataFrame作为筛选掩码。
- 应用掩码并计算均值: 将生成的掩码应用于原始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 <class 'numpy.ndarray'>.
If you want to compare values, use 'np.asarray(cat) <op> 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注意事项与总结
- rank(pct=True) 的工作原理: df.rank(pct=True) 会对DataFrame中的每一列独立进行排名,并将排名结果转换为0到1之间的百分比值。这意味着每个数值都与其所在列的整体分布相关联,而不是与一个全局的百分位阈值进行比较。
- 处理重复值: rank 方法在处理重复值时有多种策略(如method='*erage'、'min'、'max'等,默认为'*erage')。pct=True 会基于这些排名策略计算百分比。在大多数情况下,默认的'*erage'是合适的。
- 灵活性: 这种方法非常灵活,你可以轻松修改百分位范围,例如计算10%-90%或5%-95%范围内的均值,只需调整 .ge() 和 .le() 中的阈值即可。
- NaN值处理: 当布尔掩码应用于DataFrame时,不满足条件的值会被替换为 NaN。df.mean() 方法在计算均值时会自动跳过 NaN 值,这正是我们想要的行为。如果需要包含 NaN 值或以其他方式处理它们,可能需要额外的步骤。
通过利用 DataFrame.rank(pct=True),我们能够以一种简洁、高效且避免类型错误的方式,精确地筛选出指定百分位范围内的数据,并进行后续的统计分析。这在处理包含异常值或需要聚焦于数据核心分布的场景中尤其有用。
以上就是Pandas数据分析:高效计算指定百分位范围内的列均值的详细内容,更多请关注其它相关文章!
# 相关文章
# 德州企业网站关键词优化
# 沧州网站快速优化排名
# 皮鞋营销推广文案范文图片
# 启超网站建设
# 网站建设需要什么原则呢
# 金华工业品网络营销推广
# 推广网站渠道有哪些优势
# 石家庄网站建设招聘
# 外贸营销推广公司深圳
# 宁乡移动营销推广招聘
# go
# 只需
# 你可以
# 是一个
# 不完全
# 应用于
# 为其
# 掩码
# 均值
# 布尔
# red
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
在J*a中如何使用Exception包装底层异常_异常包装与信息传递方法说明
html怎么运行外部js文件中的函数_运html外js文件函数法【技巧】
文心一言怎样用批量生成做多版文案_文心一言用批量生成做多版文案【批量创作】
Excel文件在线转换快速入口 Excel在线格式转换网站
Go语言中的*string:深入理解字符串指针
J*aScript中赋值与自增运算符的复杂交互与执行机制
Sublime Text怎么设置垂直标尺_Sublime配置Rulers规范代码长度
win11如何加载ICC颜色配置文件 Win11校色文件安装与显示器色彩管理【指南】
深入理解字体排版:Adobe光学字偶距与CSS字偶距的差异与实现
Pandas DataFrame:高效添加条件计算列
J*a递归快速排序中静态变量导致数据累积问题的解决方案
优化 Jest 模拟:强制未实现函数抛出错误以提升测试效率
ArrayList与LinkedList核心操作的Big-O复杂度分析
美团外卖商家服务中心入口 美团商家版官网入口
Pyrogram与g4f集成:异步编程实践与常见错误解决
优化Django表单:提交验证失败后保留用户输入
Mac终端命令大全_Mac常用Terminal指令速查
sublime侧边栏怎么增强功能_SideBarEnhancements for sublime安装与配置
Win11 USB传输速度慢怎么解决 Win11 USB驱动更新与设置
铁路12306的积分有效期是多久_铁路12306积分有效期说明
CSS实现侧边栏导航项全宽圆角悬停背景效果
qq游戏免费畅玩入口_qq游戏电脑版快速启动
如何使 Jest 模拟函数默认抛出错误以提高测试效率
PowerPoint如何制作滚动字幕结尾彩蛋_PowerPoint路径动画实现平滑滚动字幕效果
QQ邮箱官方网页版登录 QQ邮箱个人邮箱快速访问
QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录
离线运行Go语言之旅:本地部署与GOPATH配置指南
文本文档写html代码怎么运行_文本文档html代码运行步骤【教程】
QQ邮箱在线使用入口 QQ邮箱个人账号网页版登录
如何创建没有密码的Windows本地账户_跳过微软账户登录的技巧【教程】
一加 Nord 5 隐私权限异常_一加 Nord 5 系统安全优化
J*aScript中针对特定容器内图片动画的实现教程
Fabric Mod开发:在1.19.3+版本中正确添加自定义物品并管理物品组
2026春节假期票务安排_2026春节放假购票指南
期待已久:小米17 Ultra、小米首款NAS本月登场
如何在 Windows 11 中启动游戏手柄设置
C++如何实现单例模式_C++设计模式之线程安全的单例写法
J*aScript中高效管理与清空动态列表:避免循环陷阱
c++如何使用std::memory_order控制原子操作顺序_c++ C++11内存模型详解
谷歌google账号注册详细步骤 谷歌账号注册官方教程
厨房不锈钢水槽发黑生锈怎么处理_水槽用可乐+锡纸2分钟抛亮如新
拷贝漫画电脑版官网入口 拷贝漫画(PC版)在线直达
夸克浏览器网页版最新地址 夸克浏览器官方入口合集
双系统安装时,如何设置默认启动系统? msconfig命令了解一下!
一加Ace 6T实拍样张首次公布!李杰:主摄实力完全看齐4K档性能旗舰
Lar*el用户头像管理:实现图片缩放、存储与旧文件安全删除的最佳实践
b站怎么删除评论_b站评论管理与删除操作
中兴Axon42Ultra怎样在文件App筛图_iPhone中兴Axon42Ultra文件App筛图【图片筛选】
基于动态规划的房屋花卉种植最小成本算法详解
QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台


2025-10-29
浏览次数:次
返回列表