使用Pandas和NumPy高效计算首个唯一值分组汇总

使用pandas和numpy高效计算首个唯一值分组汇总

本教程详细讲解如何利用Pandas和NumPy在数据集中创建一个新的“累计销售额”列。该列仅在每个唯一客户ID的首次出现时显示其总销售额,而在该客户ID的后续出现时则显示为零。文章将通过实际代码示例,深入解析`numpy.where`、`Series.duplicated`和`GroupBy.transform`的组合应用,提供一种高效且地道的解决方案。

在数据分析中,我们经常需要根据特定条件对数据进行汇总或标记。一个常见的场景是,我们希望在一个分组数据集中,仅在每个分组的第一个实例处显示该分组的总计值,而其余实例则显示为零。例如,在一个客户销售记录中,我们可能需要一个“累计销售额”列,它只在客户首次出现时显示该客户的总销售额,而在该客户的后续交易记录中则显示为零。

场景描述与数据示例

假设我们有一个包含客户ID、日期和单次销售额的数据集,我们希望创建一个名为Cumulative Sales的新列,其逻辑如下:

对于每个唯一的ClientID,仅在其首次出现的那一行计算并显示该客户所有Total sales的总和。对于同一个ClientID的后续出现,Cumulative Sales列的值应为0。

以下是我们的初始数据集示例:

import pandas as pdimport numpy as npdata = {    'ClientID': ['A', 'A', 'A', 'B', 'B', 'C', 'C', 'C', 'D', 'D'],    'Date': ['01-01-2000', '01-02-2000', '01-03-2000', '01-01-2000', '01-02-2000',             '01-01-2000', '01-02-2000', '01-03-2000', '01-01-2000', '01-02-2000'],    'Total sales': [100, 100, 100, 50, 50, 70, 70, 70, 20, 20]}df = pd.DataFrame(data)print("原始数据框:")print(df)

原始数据框输出如下:

原始数据框:  ClientID        Date  Total sales0        A  01-01-2000          1001        A  01-02-2000          1002        A  01-03-2000          1003        B  01-01-2000           504        B  01-02-2000           505        C  01-01-2000           706        C  01-02-2000           707        C  01-03-2000           708        D  01-01-2000           209        D  01-02-2000           20

我们的目标是生成一个Cumulative Sales列,使其看起来像这样:

  ClientID        Date  Total sales  Cumulative Sales0        A  01-01-2000          100               3001        A  01-02-2000          100                 02        A  01-03-2000          100                 03        B  01-01-2000           50               1004        B  01-02-2000           50                 05        C  01-01-2000           70               2106        C  01-02-2000           70                 07        C  01-03-2000           70                 08        D  01-01-2000           20                409        D  01-02-2000           20                 0

解决方案:结合Pandas duplicated 和 groupby().transform 与 NumPy where

为了实现上述逻辑,我们可以利用Pandas的Series.duplicated()方法来识别重复值,结合DataFrameGroupBy.transform()来计算分组总和,并最终使用NumPy的numpy.where()函数进行条件赋值。

1. 识别重复的客户ID

df[‘ClientID’].duplicated()方法会返回一个布尔型Series,其中True表示该元素是其在Series中首次出现后的重复项,False则表示该元素是首次出现。

print(df['ClientID'].duplicated())# 输出:# 0    False# 1     True# 2     True# 3    False# 4     True# 5    False# 6     True# 7     True# 8    False# 9     True# Name: ClientID, dtype: bool

这个布尔Series正是我们需要的掩码:False对应的是每个ClientID的首次出现,True对应的是后续出现。

2. 计算每个客户的总销售额并广播

df.groupby(‘ClientID’)[‘Total sales’].transform(‘sum’)会执行以下操作:

算家云 算家云

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

算家云 37 查看详情 算家云 df.groupby(‘ClientID’): 按ClientID列进行分组。[‘Total sales’]: 选取Total sales列进行操作。.transform(‘sum’): 对每个分组内的Total sales求和,并将结果“广播”回原始DataFrame的形状。这意味着,对于属于同一个ClientID的所有行,它们在transform操作后的结果列中将拥有相同的总和值。

print(df.groupby('ClientID')['Total sales'].transform('sum'))# 输出:# 0    300# 1    300# 2    300# 3    100# 4    100# 5    210# 6    210# 7    210# 8     40# 9     40# Name: Total sales, dtype: int64

这个Series包含了每个客户的总销售额,并将其正确地对齐到原始DataFrame的索引。

3. 条件赋值:使用 numpy.where

numpy.where(condition, x, y)函数根据条件选择值:

如果condition为True,则选择x。如果condition为False,则选择y。

结合我们之前得到的两个结果:

condition: df[‘ClientID’].duplicated() (当客户ID是重复时为True,首次出现时为False)x (当条件为True时选择的值): 0 (因为我们希望重复的客户ID显示0)y (当条件为False时选择的值): df.groupby(‘ClientID’)[‘Total sales’].transform(‘sum’) (因为我们希望首次出现的客户ID显示其总销售额)

因此,完整的解决方案代码如下:

df['Cumulative Sales'] = np.where(df['ClientID'].duplicated(),                                  0,                                  df.groupby('ClientID')['Total sales'].transform('sum'))print("n处理后的数据框:")print(df)

输出结果:

处理后的数据框:  ClientID        Date  Total sales  Cumulative Sales0        A  01-01-2000          100               3001        A  01-02-2000          100                 02        A  01-03-2000          100                 03        B  01-01-2000           50               1004        B  01-02-2000           50                 05        C  01-01-2000           70               2106        C  01-02-2000           70                 07        C  01-03-2000           70                 08        D  01-01-2000           20                409        D  01-02-2000           20                 0

这完美地实现了我们的目标。

总结与注意事项

这种方法利用了Pandas和NumPy的矢量化操作,效率非常高,尤其适用于大型数据集。

Series.duplicated(): 默认情况下,它会将第一次出现的值标记为False,其余重复值标记为True。如果需要将最后一次出现的值标记为False,可以使用keep=’last’参数。GroupBy.transform(): 这是一个非常强大的方法,它允许你在分组后执行聚合操作,并将结果返回到与原始DataFrame相同索引和形状的Series或DataFrame中,这使得它非常适合与assign或直接赋值结合使用。numpy.where(): 提供了一种简洁高效的条件赋值方式,避免了使用循环,显著提升了性能。

通过掌握这种组合技巧,你可以在处理复杂的数据转换任务时,以更简洁、更高效的方式实现目标。

以上就是使用Pandas和NumPy高效计算首个唯一值分组汇总的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
vivos10e处理器是什么架构
上一篇 2025年11月10日 06:21:06
win11如何恢复误删的桌面图标_Win11误删桌面图标恢复方法
下一篇 2025年11月10日 06:21:06

相关推荐

  • VSCode如何实现代码热重载 VSCode实时预览开发的高效配置方案

    使用live server扩展实现静态文件的实时预览,保存后浏览器自动刷新;2. 利用现代前端框架(如react、vue)内置的开发服务器(如vite、webpack dev server)实现hmr热模块替换,修改代码后仅更新变动模块而不刷新页面;3. 结合browsersync等工具实现多设备同…

    2026年9月24日
    000
  • T1与IG宿命交锋:电子竞技史上新篇章,10月14日上演巅峰对决

    每年秋天,《英雄联盟》全球总决赛总能掀起电子竞技的风暴,而今年的战场,北京,无疑是这场战役的焦点之一。四号种子对决,t1和ig即将上演的这场殊死搏斗,让人血脉偾张。这不仅仅是战队之间的较量,更像是电子竞技的”逆袭神话”能否继续书写的关键。然而站在t1的角度,今年的征途并不轻松…

    2026年9月24日
    200
  • 问界M5现身美国加州公路 测试车还是平行进口车?

    近日,小编注意到,有网友在社交平台发布照片称,自己于美国加州i-880公路拍摄到悬挂当地车牌的问界m5车型,引发关于该车身份的猜测:是华为官方测试车辆,还是私人渠道引入的平行进口车? ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 问界M5 …

    2026年9月24日
    000
  • 外媒测试《消逝的光芒:困兽》PC性能:运行表现相当优秀

    外媒测试《消逝的光芒:困兽》PC性能:运行表现相当优秀外媒测试《消逝的光芒:困兽》PC性能:运行表现相当优秀外媒测试《消逝的光芒:困兽》PC性能:运行表现相当优秀外媒测试《消逝的光芒:困兽》PC性能:运行表现相当优秀

    来入手《消逝的光芒:困兽》吧!现享金币优惠叠加专属优惠券折上折,标准版仅需200.9元(共节省47.1元);豪华版233.2元(总计立减54.8元)。 由Techland打造的《消逝的光芒》系列新作《消逝的光芒:困兽》已正式上线。本作背景设定在曾经风景如画、如今却尸横遍野的河狸谷。玩家将在此组建临时…

    2026年9月24日 用户投稿
    000
  • mysql临时表如何使用_PHP中操作mysql临时表的具体步骤

    MySQL临时表仅在当前会话可见,连接关闭后自动删除,适合中间数据处理。使用PHP操作时,先通过mysqli或PDO建立数据库连接,再执行CREATE TEMPORARY TABLE语句创建临时表,随后可像普通表一样进行INSERT、SELECT及JOIN等操作。临时表可与永久表同名且优先被使用,支…

    2026年9月24日
    000
  • UC浏览器怎么查看和清除LocalStorage数据 UC浏览器LocalStorage数据管理方法

    可通过隐私设置清除或开发者工具查看LocalStorage。①在UC浏览器设置中选择“隐私与安全”→“清除浏览数据”,勾选“Cookie及其他网站数据”即可批量删除LocalStorage;②打开uc://inspect启用开发者工具,通过电脑Chrome远程调试查看具体键值对;③root设备后使用…

    2026年9月24日
    200
  • Java语法基础中static关键字可以修饰哪些内容

    static关键字用于定义类成员,包括静态变量(如计数器)、静态方法(如工具方法)、静态代码块(类加载时执行)和静态内部类(不依赖外部类实例),均属于类而非对象,通过类名访问,提升成员至类级别实现共享与提前使用。 static 关键字在 Java 中主要用于定义与类相关而非与对象实例相关的成员。它不…

    2026年9月24日
    100
  • 强制联网! 《战地6》单人战役模式无法离线游玩

    强制联网! 《战地6》单人战役模式无法离线游玩强制联网! 《战地6》单人战役模式无法离线游玩强制联网! 《战地6》单人战役模式无法离线游玩强制联网! 《战地6》单人战役模式无法离线游玩

    《战地6》本有机会打破近年来游戏行业普遍采用的“光盘仅附激活码”的做法——这一次,所有游戏内容都被完整地刻录在了实体光盘中。然而令人失望的是,即便如此,玩家若想体验单人战役,依然必须保持网络连接。 这一设定带来了诸多问题。对于只想沉浸于单人剧情、无意参与多人对战的玩家来说,他们仍需和数百万在线用户一…

    2026年9月24日 用户投稿
    000
  • 全模组电源比非模组电源好在哪里?

    全模组电源优势在于线材管理、升级便利和系统整洁。其线材可自由拆装,减少冗余,提升散热与走线美观;支持多平台共用和单独更换线材,便于升级与故障处理;适合追求整洁与DIY的用户,虽价格较高但灵活性更强。 全模组电源相比非模组电源,主要优势体现在线材管理、升级便利性和整体系统整洁度上。它并不是在性能或效率…

    2026年9月24日
    100
  • 抖音怎么看注册时间?怎么看百度网盘注册时间

    抖音已然成为国内炙手可热的短视频平台之一。凭借其独特的智能推荐系统,用户能够在短时间内找到自己喜爱的内容。你是否知道,你的抖音注册时间实际上隐含了许多关于你的社交轨迹的信息呢?本文将带领大家一同揭秘抖音注册时间背后的故事。 一、抖音注册时间的意义 1. 用户活跃程度的体现 抖音注册时间能够帮助我们判…

    2026年9月24日
    100
  • mysql中*是什么意思 mysql星号通配符解析

    在 mysql 中,星号()最常用于 select 语句中代表所有列,但应谨慎使用。1)它方便查看所有数据,但可能返回不必要的数据,影响性能。2)使用可能降低代码可维护性,建议明确列出所需列。3)在like操作符中,不是通配符,需用regexp。4)在视图中使用可能导致定义失效。5)可结合limit…

    2026年9月24日
    000
  • 为什么要4k对齐

    早期硬盘的每个扇区以512字节为标准,而新一代硬盘的扇区容量则为4096个字节,即所谓的4k扇区。虽然硬盘标准已经更新,但操作系统仍然使用512字节扇区的标准。为了确保兼容性,硬盘制造商将4k扇区模拟成了512字节扇区。文件系统的块(簇)通常是512字节的倍数,而新系统大多设定为4k的倍数,例如li…

    2026年9月24日
    000
  • Yii框架的验证器:如何确保输入数据的正确性

    yii框架是一款高效、快速的php框架,提供了丰富的功能和组件,使开发者能够快速构建web应用程序。其中,验证器是yii框架中一个非常重要的组件,可以确保输入数据的正确性。本文将介绍yii框架的验证器是如何工作的,以及如何使用验证器来确保输入数据的正确性。 Yii框架验证器的工作原理 在Yii框架中…

    用户投稿 2026年9月24日
    100
  • 罗技gpw鼠标驱动如何调节DPI?罗技gpw鼠标驱动调节DPI的方法

    罗技gpw鼠标驱动如何调节DPI?罗技gpw鼠标驱动调节DPI的方法罗技gpw鼠标驱动如何调节DPI?罗技gpw鼠标驱动调节DPI的方法罗技gpw鼠标驱动如何调节DPI?罗技gpw鼠标驱动调节DPI的方法罗技gpw鼠标驱动如何调节DPI?罗技gpw鼠标驱动调节DPI的方法

    罗技gpw鼠标驱动专为gpw打造,提供毫秒级响应速度,支持一键关闭板载模式后自由调节dpi。在灵敏度设置界面中,只需拖动滑块即可精准调整当前dpi值,并可最多预设4个档位,通过鼠标上的dpi按键实现快速切换。 罗技gpw鼠标驱动如何调节DPI?详细操作步骤如下: 首先使用数据线将鼠标连接至电脑,并在…

    2026年9月24日 用户投稿
    200
  • 1-6月乘用车HUD标配装配量TOP20车型:问界M9第四

      近日,有机构公布了2025年1至6月国内乘用车hud功能标配装配量top20车型。其中,理想l6、l7、l8、l9和问界m9、m8等车型装配率(装配率=装配量/零售量)均为100%。此外,6月国内hud标配装配率接近20%。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 …

    2026年9月24日
    800
  • mac怎么合并访达窗口_mac Finder窗口合并技巧

    可通过“窗口”菜单中的“合并所有窗口”命令将多个访达窗口整合为标签页;2. 也可手动拖动窗口标题栏至另一窗口顶部标签栏以创建标签页;3. 结合Control+上箭头进入台前调度,可辅助分组管理并优化多窗口操作体验。 如果您在使用Mac时打开了多个“访达”窗口,导致桌面显得杂乱,可以通过合并窗口的方式…

    2026年9月24日
    000
  • realmeQ系列应用删不了怎么办?教你解决系统应用的卸载难题

    无法卸载realme Q系列预装应用时,首先尝试通过应用信息页面卸载;若失败,可前往软件商店修复或更新;仍无效则进入安全模式卸载;最后检查设备管理权限并清除数据缓存以解除限制。 如果您尝试从realme Q系列手机中删除某个应用,但发现无法完成卸载操作,这通常是因为该应用属于系统预装程序或具有特殊权…

    2026年9月24日
    000
  • Yii框架中的认证授权:保护应用程序安全

    随着互联网的快速发展,安全问题成为越来越多公司和组织关注的话题。在这个时代中,任何一个应用程序都可能面临黑客、恶意软件和其他安全威胁。为此,开发者需要采取措施来保护应用程序的安全性能。本文将介绍 yii框架中的认证和授权功能,以帮助开发者保证其应用的安全性。 Yii框架的认证和授权功能 Yii框架提…

    用户投稿 2026年9月24日
    200
  • 抖音怎么下载视频?抖音怎么提取别人的视频

    抖音作为一个热门的短视频社交平台,凭借其多样化的短视频内容吸引了众多用户。部分用户在浏览抖音视频时,希望能将其保存下来以供后续观看。那么,如何在抖音上下载视频呢?接下来,本文将详细介绍几种下载抖音视频的方法以及相关的注意事项。 一、抖音视频下载方法 使用抖音官方提供的下载功能 抖音自身具备下载功能,…

    2026年9月24日
    400
  • google浏览器怎么把网页保存为PDF_google浏览器网页保存为PDF方法

    使用Chrome将网页保存为PDF,首先按Ctrl+P进入打印界面,选择“另存为PDF”并调整设置后保存;也可通过F12打开开发者工具,截取指定元素或完整页面截图后转为PDF;还可安装“Save as PDF”等扩展程序实现更高质量的导出。 如果您希望将当前浏览的网页完整保存以便离线查看或分享,Go…

    2026年9月24日
    000

发表回复

登录后才能评论
关注微信