使用Pandas和NumPy在数据集中为唯一ID的首个实例计算累积总和

DDD
发布: 2025-11-06 12:42:12
原创
1006人浏览过

使用pandas和numpy在数据集中为唯一id的首个实例计算累积总和

本教程详细介绍了如何利用Pandas和NumPy,在数据集中创建一个新的“累积销售额”列。该列仅在每个唯一客户ID的首次出现时显示其总销售额之和,而在该客户ID的后续出现时则显示为零。文章通过结合`Series.duplicated()`、`GroupBy.transform()`和`numpy.where()`函数,提供了一种高效且专业的解决方案,确保数据处理的准确性和逻辑性。

在数据分析和报告中,我们经常需要对特定实体(如客户、产品)的总量进行汇总,但又希望这些汇总值只在实体首次出现时显示,而在后续的记录中显示为零。这种处理方式有助于清晰地识别每个实体的总贡献,避免重复计算,并简化数据呈现。本教程将演示如何使用Python的Pandas库和NumPy库高效地实现这一需求。

问题描述

假设我们有一个包含客户ID、日期和每日销售额的数据集。我们的目标是创建一个名为“Cumulative Sales”(累积销售额)的新列,其逻辑如下:

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

以下是示例数据集的结构:

  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

解决此问题的核心在于两个关键步骤:首先,识别每个ClientID的首次出现;其次,计算每个ClientID的总销售额。Pandas和NumPy提供了强大的工具来高效完成这些操作。

我们将使用以下三个主要函数:

  • pandas.Series.duplicated():用于识别序列中的重复值。当keep='first'(默认值)时,它会标记除第一次出现之外的所有重复项为True。
  • pandas.DataFrame.groupby().transform():对DataFrame进行分组操作,并将聚合结果广播回原始DataFrame的形状。
  • numpy.where():根据条件选择不同值的函数。

步骤一:导入必要的库并准备数据

首先,我们需要导入Pandas和NumPy库,并创建示例DataFrame。

import pandas as pd
import numpy as np

# 创建示例DataFrame
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("原始DataFrame:")
print(df)
登录后复制

步骤二:识别非重复的ClientID

我们可以使用df['ClientID'].duplicated()来生成一个布尔序列,其中True表示该行对应的ClientID是重复的(即不是第一次出现),False表示它是首次出现。

is_duplicated = df['ClientID'].duplicated()
print("\nClientID的重复状态 (False为首次出现):")
print(is_duplicated)
登录后复制

输出将是:

协和·太初
协和·太初

国内首个针对罕见病领域的AI大模型

协和·太初 38
查看详情 协和·太初
0    False
1     True
2     True
3    False
4     True
5    False
6     True
7     True
8    False
9     True
Name: ClientID, dtype: bool
登录后复制

步骤三:计算每个ClientID的总销售额

为了获取每个ClientID的总销售额,并将其应用于原始DataFrame的每一行(以便与duplicated()的结果对齐),我们使用groupby()结合transform()。

client_total_sales = df.groupby('ClientID')['Total sales'].transform('sum')
print("\n每个ClientID的总销售额 (广播到原始DataFrame形状):")
print(client_total_sales)
登录后复制

transform('sum')的强大之处在于,它会计算每个分组的总和,然后将这个总和广播回原始DataFrame中对应分组的每一行。例如,对于ClientID 'A',其总销售额是100+100+100=300,那么client_total_sales中所有ClientID 'A'对应的行都将是300。

输出将是:

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
登录后复制

步骤四:结合条件逻辑创建“Cumulative Sales”列

现在,我们有了两个关键部分:一个布尔序列指示哪些行是重复的ClientID,以及一个包含每个ClientID总销售额的序列。我们可以使用numpy.where()将它们结合起来:

np.where(condition, value_if_true, value_if_false)

在这个场景中:

  • condition 是 df['ClientID'].duplicated()。
  • value_if_true (当ClientID是重复时) 是 0。
  • value_if_false (当ClientID是首次出现时) 是 df.groupby('ClientID')['Total sales'].transform('sum')。
df['Cumulative Sales'] = np.where(df['ClientID'].duplicated(), 
                                  0, 
                                  df.groupby('ClientID')['Total sales'].transform('sum'))

print("\n最终DataFrame:")
print(df)
登录后复制

最终输出

最终DataFrame:
  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.Series.duplicated()、pandas.DataFrame.groupby().transform()和numpy.where(),我们能够高效且简洁地在Pandas DataFrame中创建一列,该列仅在每个唯一ID的首次出现时显示其分组总和,而在后续出现时显示为零。这种方法在处理大量数据时表现出色,是数据清洗和特征工程中的一个实用技巧。理解transform()的广播机制和duplicated()的条件判断是掌握此解决方案的关键。

以上就是使用Pandas和NumPy在数据集中为唯一ID的首个实例计算累积总和的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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