使用Pandas和SciPy计算分组扩展窗口的百分位数排名

使用Pandas和SciPy计算分组扩展窗口的百分位数排名

本文详细介绍了如何利用pandas的`groupby`和`expanding`功能,结合scipy的`percentileofscore`函数,在数据集中计算分组和扩展窗口的百分位数排名。文章通过一个实际示例,阐明了在`apply`方法中使用lambda函数时,正确引用窗口数据`x`的关键,并提供了清晰的代码实现和解释,帮助读者避免常见错误,高效完成复杂的数据分析任务。

在数据分析中,我们经常需要计算某个值在其所属组内,并且在不断增长的数据窗口中的百分位数排名。这涉及到Pandas的几个核心功能:分组聚合(groupby)、窗口操作(expanding)以及统计函数(如scipy.stats.percentileofscore)。然而,将这些功能组合起来时,尤其是在使用apply方法配合lambda表达式时,常常会遇到一些挑战。

理解核心概念

在深入解决方案之前,我们先回顾一下涉及到的关键概念:

百分位数排名 (percentileofscore):scipy.stats.percentileofscore(a, score) 函数计算在给定数据集 a 中,值 score 的百分位数排名。它返回一个介于0到100之间的浮点数,表示数据集中有多少比例的值小于或等于 score。分组操作 (groupby):Pandas的groupby方法用于根据一个或多个列的值将DataFrame分割成多个组,然后对每个组独立地执行操作。扩展窗口 (expanding):expanding是一个窗口函数,它在DataFrame或Series上创建一个不断增长的窗口。这意味着对于每个数据点,窗口包含从序列开始到当前点(包括当前点)的所有数据。apply 方法:apply方法是Pandas中一个非常强大的工具,它允许用户将一个函数(通常是自定义函数或lambda函数)应用到DataFrame的行、列或分组后的数据上。

常见问题与误区

在尝试计算分组扩展窗口的百分位数排名时,一个常见的错误是在apply方法中,lambda函数没有正确地引用expanding窗口传递给它的数据。例如,如果尝试像下面这样编写代码:

# 错误的示例df['pct'] = df.groupby(['Category']).expanding(1).apply(lambda x: stats.percentileofscore(df['values'], 1)).reset_index(0, drop=True)

这里的问题在于 lambda x: stats.percentileofscore(df[‘values’], 1)。当 expanding 窗口调用 apply 时,它会将当前窗口的数据作为一个Series(或DataFrame)传递给 x。然而,在上面的错误示例中,lambda函数内部却硬编码了 df[‘values’] 和一个固定的值 1,这导致它没有利用 x(即当前窗口的数据),也没有动态地获取当前要计算百分位数的值。实际上,我们希望 x 既是计算百分位数的数据集,又是要计算百分位数的值。

正确的解决方案

为了正确地计算分组扩展窗口的百分位数排名,我们需要确保lambda函数能够访问当前窗口的数据,并从中提取出需要计算百分位数的值。通常,当expanding与apply结合使用时,x代表了当前扩展窗口内的所有数据。我们可以使用x作为percentileofscore的第一个参数(即数据集),并使用x的最后一个值(即当前点的值)作为第二个参数(即要计算百分位数的值)。

下面是一个完整的示例,演示了如何正确实现这一功能:

import pandas as pdimport numpy as npfrom scipy.stats import percentileofscore# 构造一个示例DataFramedf = pd.DataFrame([        ['alex', 'alex', 'bob', 'alex', 'bob', 'alex', 'bob', 'bob'],        [0, 3, 10, 1, 15, 6, 12, 18]                  ]).Tdf.columns = ['Category', 'values']df['values'] = df['values'].astype(int) # 确保'values'列是数值类型print("原始DataFrame:")print(df)print("-" * 30)# 计算分组扩展窗口的百分位数排名# 步骤1: 按 'Category' 列分组# 步骤2: 对每个组应用 expanding(1) 窗口,表示从第一个元素开始扩展# 步骤3: 对每个窗口应用 lambda 函数#        x 代表当前窗口的 Series。#        percentileofscore(x, x.iloc[-1]) 表示在当前窗口 x 中,#        计算 x 的最后一个元素(即当前点的值)的百分位数排名。df['pct'] = df.groupby(['Category'])                 .expanding(1)['values']                 .apply(lambda x: percentileofscore(x, x.iloc[-1]))                 .reset_index(level=0, drop=True) # 重置索引,移除 expanding 引入的额外层级print("n计算百分位数排名后的DataFrame:")print(df)

代码解释:

df.groupby([‘Category’]): 首先,我们将DataFrame按照Category列进行分组。这将确保alex和bob的数据分别进行处理。.expanding(1)[‘values’]: 接着,我们对每个分组应用expanding(1)窗口。expanding(1)表示窗口从第一个元素开始(最小窗口大小为1)。[‘values’]指定了我们希望在哪个Series上应用窗口和后续的apply操作。.apply(lambda x: percentileofscore(x, x.iloc[-1])): 这是核心部分。x:在expanding().apply()的上下文中,x代表了当前扩展窗口的values Series。percentileofscore(x, x.iloc[-1]):我们将整个窗口x作为percentileofscore的第一个参数(数据集),将窗口中的最后一个值(即当前行对应的values值)作为第二个参数(要计算百分位数的值)。这样,对于alex组的第一个值0,x是[0],计算percentileofscore([0], 0);对于第二个值3,x是[0, 3],计算percentileofscore([0, 3], 3),依此类推。.reset_index(level=0, drop=True): groupby().expanding()操作会引入一个多级索引,其中第一级是Category。reset_index(level=0, drop=True)用于移除这个额外的Category索引层,使结果Series的索引与原始DataFrame的索引对齐,方便将结果赋值回df[‘pct’]。

示例运行结果

原始DataFrame:  Category  values0     alex       01     alex       32      bob      103     alex       14      bob      155     alex       66      bob      127      bob      18------------------------------计算百分位数排名后的DataFrame:  Category  values   pct0     alex       0   50.01     alex       3  100.02      bob      10   50.03     alex       1   66.6666674      bob      15  100.05     alex       6  100.06      bob      12   66.6666677      bob      18  100.0

注意事项与总结

数据类型:确保你正在计算百分位数的列是数值类型。如果不是,需要先进行类型转换,例如df[‘values’] = df[‘values’].astype(int)。expanding(min_periods):expanding函数可以接受一个min_periods参数,指定计算所需的最小非NA观测值数量。在我们的例子中,expanding(1)意味着只要有一个值,就可以开始计算。根据你的业务需求,可能需要调整这个值。percentileofscore的kind参数:percentileofscore函数有一个kind参数,默认为’rank’。你可以根据需要选择其他类型,如’weak’, ‘strict’, ‘mean’,它们在处理重复值时有不同的行为。性能考量:对于非常大的数据集,apply方法可能不是最高效的。在某些情况下,可以考虑使用Numba或Cython进行性能优化,或者寻找Pandas内置的向量化替代方案(尽管对于percentileofscore这种复杂的自定义窗口操作,apply通常是直接且可读性强的选择)。

通过上述方法,我们可以有效地结合Pandas的分组和扩展窗口功能与SciPy的统计函数,灵活地对数据进行复杂的分析。理解apply方法中x参数的正确用法是解决此类问题的关键。

以上就是使用Pandas和SciPy计算分组扩展窗口的百分位数排名的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1378481.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
KivyMD应用中登录页面到主页的正确导航与屏幕管理
上一篇 2025年12月14日 19:49:18
跨平台获取学术会议论文标题:OpenReview API 进阶与网络爬取策略
下一篇 2025年12月14日 19:49:36

相关推荐

  • 点淘直播间怎么进入_点淘直播间如何进入观看互动购物教程

    1、打开点淘APP点击首页,滑动查找直播卡片进入;2、通过顶部搜索框输入主播或商品名,切换至直播页进入;3、在“我的”关注列表中查看正在直播的主播;4、从商品详情页的直播提示按钮跳转进入直播间。 如果您想通过点淘APP观看直播并参与互动购物,但不清楚如何进入直播间,可能是由于入口位置不熟悉或操作流程…

    2026年9月3日
    000
  • 我的世界不可获得物品有哪些 不可获得物品种类介绍

    我的世界不可获得物品有哪些 不可获得物品种类介绍我的世界不可获得物品有哪些 不可获得物品种类介绍我的世界不可获得物品有哪些 不可获得物品种类介绍我的世界不可获得物品有哪些 不可获得物品种类介绍

    我的世界中存在一些在生存模式下无法正常获取的特殊物品,主要包括屏障方块、结构方块和命令方块,以下是对这些物品及其特点的具体介绍。 我的世界不可获得物品具体如下: 一、屏障方块属于生存模式中无法正常获取的物品,除非使用作弊手段。该方块在创造模式中可以找到,放置后呈隐形状态,常用于地图设计中控制玩家活动…

    2026年9月3日 用户投稿
    100
  • 电脑重新做系统后原来的软件怎么恢复

    一、准备工作 在开始恢复原有软件之前,需要提前准备好一些必要的工具。首先,务必备份好个人的重要文件和资料,防止数据丢失。其次,准备一个可用的系统安装盘或U盘,以便进行系统重装。此外,保持网络连接稳定也很重要,这样可以方便后续下载和安装软件。 二、具体操作 1. 重新下载并安装 大多数软件都可以通过官…

    2026年9月3日
    300
  • 今日头条直播间怎么送礼物_今日头条直播互动礼物赠送教程

    1、在今日头条直播间送礼物可直接表达对主播的支持。2、通过手机APP进入直播间,点击“礼物”按钮选择并送出礼物,余额不足时可充值。3、使用PC端直播伴侣时,观众仍需用手机完成送礼操作,礼物信息会同步至电脑端。4、参与福袋活动虽不能直接送礼,但中奖后可获得平台奖励,增强互动体验。 如果您想在今日头条直…

    2026年9月3日
    200
  • 告别支付难题:使用Softon/Indipay 简化印度支付网关集成

    在为印度市场开发一个电商应用时,我面临着一个巨大的挑战:如何高效地集成多个印度支付网关,例如ccavenue、payumoney、paytm等等。每个网关都有其独特的api和参数要求,单独集成每个网关不仅费时费力,而且容易出错。维护和更新这些集成也变得异常困难。 我最初尝试分别集成每个网关,但很快发…

    用户投稿 2026年9月3日
    200
  • 123网盘如何批量删除文件_123网盘批量删除文件操作教程

    123网盘暂无官方批量删除功能,但可通过网页端按住Ctrl或Command键多选文件后删除,或通过回收站清空多个文件;移动端仅支持单个删除,建议使用电脑操作,并注意定期清理回收站以节省空间。 123网盘目前未提供官方的“批量删除”功能入口,但用户仍可通过一些操作技巧实现多文件的快速删除。以下是具体的…

    2026年9月3日
    100
  • win10文件权限怎么修改_win10文件夹所有权与权限修改教程

    1、通过属性-安全-高级更改文件夹所有者为当前用户,并替换子容器所有权;2、编辑安全权限,为当前用户添加完全控制允许权限;3、使用管理员命令提示符执行takeown和icacls命令获取所有权并赋予权限;4、在高级安全设置中禁用继承,转换并自定义显式权限。 如果您尝试访问或修改某个文件或文件夹,但系…

    2026年9月3日
    100
  • 飞猪旅行怎么获取旅游攻略_飞猪旅行旅行攻略查找技巧

    答案:打开飞猪App,通过首页“目的地”入口搜索城市,可获取官方整理的景点、路线等攻略,结合促销活动与热门趋势,边查边省。 打开飞猪App,直接获取旅游攻略很简单。首页就有“目的地”入口,点进去输入你想去的城市,比如“北京”或“杭州”,就能看到官方整理的热门景点、经典路线和必玩项目。 看城市专题页,…

    2026年9月3日
    100
  • Podman 已成 Linux 官方标配!Docker 没戏了?

    Podman 已成 Linux 官方标配!Docker 没戏了?Podman 已成 Linux 官方标配!Docker 没戏了?Podman 已成 Linux 官方标配!Docker 没戏了?Podman 已成 Linux 官方标配!Docker 没戏了?

    podman 简介 Podman 是一个开源项目,在 GitHub 上已获得超过 12,000 个星标,可以在大多数 Linux 平台上运行。Podman 是一个无守护进程的容器引擎,用于在 Linux 系统上开发、管理和运行 OCI(开放容器倡议)容器和容器镜像。Podman 提供了与 Docke…

    2026年9月3日 用户投稿
    300
  • win10任务栏卡死点不动怎么办_win10任务栏无响应卡死解决方法

    任务栏无法点击可尝试重启Windows资源管理器,禁用资讯和兴趣功能,使用PowerShell重新部署应用包,关闭多显示器任务栏同步,或运行SFC扫描修复系统文件。 如果您在使用Windows 10时发现任务栏无法点击或响应迟缓,这可能是由于系统资源管理器异常、功能冲突或后台进程占用过高导致的。以下…

    2026年9月3日
    200
  • 123云盘Mac版怎么安装_123云盘Mac版安装指南

    首先确认安装包来源并调整系统权限,从官网下载123云盘Mac版.dmg文件,遇安全提示时前往“隐私与安全性”设置点击“仍要打开”,随后挂载安装包并将应用拖入“应用程序”文件夹,最后启动应用完成登录与初始化配置。 如果您尝试在Mac设备上安装123云盘,但无法正常完成安装过程,则可能是由于系统权限设置…

    2026年9月3日
    200
  • VSCode怎么写CSS文件_VSCode编写和预览CSS样式表详细教程

    VSCode怎么写CSS文件_VSCode编写和预览CSS样式表详细教程VSCode怎么写CSS文件_VSCode编写和预览CSS样式表详细教程VSCode怎么写CSS文件_VSCode编写和预览CSS样式表详细教程VSCode怎么写CSS文件_VSCode编写和预览CSS样式表详细教程

    首先新建.css文件并编写样式,通过链接HTML或使用Live Server插件实时预览;推荐使用CSS Peek、IntelliSense、Prettier等插件提升效率;调试可借助浏览器开发者工具,大型项目建议采用Sass、BEM命名和模块化管理。 VSCode编写CSS文件,简单来说,就是新建…

    2026年9月3日 用户投稿
    300
  • mac使用命令安装软件

    mac使用命令安装软件mac使用命令安装软件mac使用命令安装软件mac使用命令安装软件

    答案:Homebrew是macOS上高效管理命令行工具和图形应用的包管理器,通过简单命令实现软件安装、更新与卸载,支持依赖处理和Cask图形应用安装,安全可靠且可与其他语言包管理器协同使用。 在macOS上,想要通过命令来安装软件,最核心且效率最高的方式就是借助一个叫做Homebrew的包管理器。它…

    2026年9月3日 用户投稿
    300
  • 探探修改定位怎么实现_探探虚拟定位异地交友教程

    可通过虚拟定位实现探探异地交友。①使用“Fake GPS Location”等App修改iPhone定位;②用雷电模拟器在电脑运行探探并篡改GPS;③技术用户可重签名IPA注入定位模块,持久化伪装位置。 如果您希望在探探上实现异地交友,但受限于当前地理位置无法匹配到目标城市用户,则可以通过修改定位来…

    2026年9月3日
    100
  • HDC2025鲸鸿动能品牌增长沙龙:拿回营销主动权,驱动确定性增长

    HDC2025鲸鸿动能品牌增长沙龙:拿回营销主动权,驱动确定性增长HDC2025鲸鸿动能品牌增长沙龙:拿回营销主动权,驱动确定性增长HDC2025鲸鸿动能品牌增长沙龙:拿回营销主动权,驱动确定性增长HDC2025鲸鸿动能品牌增长沙龙:拿回营销主动权,驱动确定性增长

    6月19日,hdc2025分论坛期间,鲸鸿动能举办了品牌增长主题沙龙。来自多个行业的资深人士,包括知名品牌代表、创意先锋及技术企业负责人齐聚一堂,围绕“确定性增长”这一核心议题,展开深入交流,共同探索如何重掌营销主动权。 在当前多变的市场环境中,“营销失权”成为众多品牌面临的难题。企业常常陷入被动应…

    2026年9月3日 用户投稿
    100
  • win8系统文件复制进度卡住_win8数据传输中断的解决方案

    win8系统文件复制进度卡住_win8数据传输中断的解决方案win8系统文件复制进度卡住_win8数据传输中断的解决方案win8系统文件复制进度卡住_win8数据传输中断的解决方案win8系统文件复制进度卡住_win8数据传输中断的解决方案

    win8文件复制卡住或传输中断的解决方法包括:1.检查磁盘空间是否足够,腾出空间后重试;2.检测磁盘健康状况,使用工具修复坏道;3.运行chkdsk命令修复文件系统错误;4.更新驱动或更换usb接口以解决兼容性问题;5.排查文件本身是否损坏;6.关闭杀毒软件避免干扰;7.检查网络连接及权限设置;8.…

    2026年9月3日 用户投稿
    300
  • 解决文件上传和字符串处理的困境:moxuandi/yii2-helpers 库的实践应用

    composer在线学习地址:学习地址 在项目开发过程中,文件上传和字符串处理是两个常见的需求,但它们也常常会带来一些挑战。例如,如何高效地处理不同格式的图片上传,如何格式化文件大小,或者如何获取图片的属性等。这些问题在没有合适工具的情况下,可能会导致代码冗长且难以维护。 幸运的是,moxuandi…

    用户投稿 2026年9月3日
    100
  • win11怎么使用性能监视器_Win11性能监视器使用详解

    首先打开性能监视器(perfmon)生成系统性能报告,再通过任务管理器查看实时资源占用,并可启用游戏栏叠加层监控CPU、内存、GPU等指标。 如果您需要对Windows 11系统的运行状况进行深度分析,以排查性能瓶颈或资源占用异常问题,可以利用系统内置的性能监视器工具获取详尽的数据报告。以下是具体的…

    2026年9月3日
    200
  • Safari网页版入口 Safari直接打开

    Safari网页版可通过官网https://www.apple.com/safari/直接访问,支持跨平台浏览,页面加载快且适配多语言;具备节能、防跟踪、支持现代网页标准等技术优势,并与Apple生态无缝集成,提供简洁界面、阅读器模式和手势导航等优质用户体验。 Safari网页版入口 Safari直…

    2026年9月3日
    200
  • 使用 Composer 解决 PHP 代码风格问题:Classy-org/php-classy-standards 库的实践

    可以通过以下地址学习 composer:学习地址 在开发 PHP 项目时,保持代码风格的一致性是一个挑战。团队中的每个开发者都有自己的编码习惯,这导致了代码库中的风格杂乱无章,影响了项目的整体质量和维护效率。我尝试了手动修改代码、使用 IDE 插件等方法,但这些方法都无法有效地解决问题。 在不断探索…

    用户投稿 2026年9月3日
    200

发表回复

登录后才能评论
关注微信