
本教程详细讲解如何利用Pandas和NumPy在数据集中创建一个新的“累计销售额”列。该列仅在每个唯一客户ID的首次出现时显示其总销售额,而在该客户ID的后续出现时则显示为零。文章将通过实际代码示例,深入解析`numpy.where`、`Series.duplicated`和`GroupBy.transform`的组合应用,提供一种高效且地道的解决方案。
在数据分析中,我们经常需要根据特定条件对数据进行汇总或标记。一个常见的场景是,我们希望在一个分组数据集中,仅在每个分组的第一个实例处显示该分组的总计值,而其余实例则显示为零。例如,在一个客户销售记录中,我们可能需要一个“累计销售额”列,它只在客户首次出现时显示该客户的总销售额,而在该客户的后续交易记录中则显示为零。
假设我们有一个包含客户ID、日期和单次销售额的数据集,我们希望创建一个名为Cumulative Sales的新列,其逻辑如下:
以下是我们的初始数据集示例:
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的Series.duplicated()方法来识别重复值,结合DataFrameGroupBy.transform()来计算分组总和,并最终使用NumPy的numpy.where()函数进行条件赋值。
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对应的是后续出现。
df.groupby('ClientID')['Total sales'].transform('sum')会执行以下操作:
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的索引。
numpy.where(condition, x, y)函数根据条件选择值:
结合我们之前得到的两个结果:
因此,完整的解决方案代码如下:
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的矢量化操作,效率非常高,尤其适用于大型数据集。
通过掌握这种组合技巧,你可以在处理复杂的数据转换任务时,以更简洁、更高效的方式实现目标。
以上就是使用Pandas和NumPy高效计算首个唯一值分组汇总的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号