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)

输出将是:

Memories.ai
Memories.ai

专注于视频解析的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()的条件判断是掌握此解决方案的关键。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

771

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

661

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

764

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

679

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1345

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

549

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

579

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

730

2023.08.11

菜鸟裹裹入口以及教程汇总
菜鸟裹裹入口以及教程汇总

本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

0

2026.01.22

热门下载

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

精品课程

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

共4课时 | 12.7万人学习

Django 教程
Django 教程

共28课时 | 3.4万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.2万人学习

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

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