0

0

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

DDD

DDD

发布时间:2025-11-06 12:42:12

|

1029人浏览过

|

来源于php中文网

原创

使用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)

输出将是:

Cutout.Pro
Cutout.Pro

AI驱动的视觉设计平台

下载
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()的条件判断是掌握此解决方案的关键。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

68

2025.12.04

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

9

2026.01.30

c++ 字符串格式化
c++ 字符串格式化

本专题整合了c++字符串格式化用法、输出技巧、实践等等内容,阅读专题下面的文章了解更多详细内容。

9

2026.01.30

java 字符串格式化
java 字符串格式化

本专题整合了java如何进行字符串格式化相关教程、使用解析、方法详解等等内容。阅读专题下面的文章了解更多详细教程。

11

2026.01.30

python 字符串格式化
python 字符串格式化

本专题整合了python字符串格式化教程、实践、方法、进阶等等相关内容,阅读专题下面的文章了解更多详细操作。

3

2026.01.30

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

20

2026.01.29

java配置环境变量教程合集
java配置环境变量教程合集

本专题整合了java配置环境变量设置、步骤、安装jdk、避免冲突等等相关内容,阅读专题下面的文章了解更多详细操作。

17

2026.01.29

java成品学习网站推荐大全
java成品学习网站推荐大全

本专题整合了java成品网站、在线成品网站源码、源码入口等等相关内容,阅读专题下面的文章了解更多详细推荐内容。

19

2026.01.29

Java字符串处理使用教程合集
Java字符串处理使用教程合集

本专题整合了Java字符串截取、处理、使用、实战等等教程内容,阅读专题下面的文章了解详细操作教程。

3

2026.01.29

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.7万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

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

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