0

0

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

花韻仙語

花韻仙語

发布时间:2025-11-03 12:43:01

|

482人浏览过

|

来源于php中文网

原创

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

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

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

场景描述与数据示例

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

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

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

import pandas as pd
import numpy as np

data = {
    '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 sales
0        A  01-01-2000          100
1        A  01-02-2000          100
2        A  01-03-2000          100
3        B  01-01-2000           50
4        B  01-02-2000           50
5        C  01-01-2000           70
6        C  01-02-2000           70
7        C  01-03-2000           70
8        D  01-01-2000           20
9        D  01-02-2000           20

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

  ClientID        Date  Total sales  Cumulative Sales
0        A  01-01-2000          100               300
1        A  01-02-2000          100                 0
2        A  01-03-2000          100                 0
3        B  01-01-2000           50               100
4        B  01-02-2000           50                 0
5        C  01-01-2000           70               210
6        C  01-02-2000           70                 0
7        C  01-03-2000           70                 0
8        D  01-01-2000           20                40
9        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')会执行以下操作:

故事AI绘图神器
故事AI绘图神器

文本生成图文视频的AI工具,无需配音,无需剪辑,快速成片,角色固定。

下载
  • 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 Sales
0        A  01-01-2000          100               300
1        A  01-02-2000          100                 0
2        A  01-03-2000          100                 0
3        B  01-01-2000           50               100
4        B  01-02-2000           50                 0
5        C  01-01-2000           70               210
6        C  01-02-2000           70                 0
7        C  01-03-2000           70                 0
8        D  01-01-2000           20                40
9        D  01-02-2000           20                 0

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

总结与注意事项

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

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

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

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

52

2025.12.04

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

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

52

2025.12.04

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

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

466

2023.07.04

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

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

279

2023.08.07

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

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

731

2023.10.16

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

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

508

2024.03.13

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

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

71

2025.09.08

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

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

55

2025.10.14

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

19

2026.01.20

热门下载

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

精品课程

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

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