You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Pandas DataFrame添加分组对应的唯一CampaignId计数列并确保映射正确

解决Pandas分组计数并映射回原DataFrame的问题

嗨,我来帮你搞定这个需求!你想要把分组后的唯一活动ID(campaignId)计数作为新列添加回原DataFrame,并且确保每一行都能对应到正确的分组结果对吧?下面给你几种实用的实现方法,覆盖不同的分组场景:

1. 按单一维度分组(比如渠道channel)

最简洁的方式是用transform方法,它会自动把分组计算的结果广播到该组的每一行,完美匹配原DataFrame的行数:

# 确保先导入pandas
import pandas as pd

# 你的原始数据
data = [ [38338792, 'Display', 100.00, '2021-06-26'], [38338792, 'Display', 100.00, '2021-06-27'], [12455623, 'Display', 100.00, '2021-06-27'], [10107107890, 'Search', 35.00, '2021-06-27'] ]
df = pd.DataFrame(data, columns = ['campaignId', 'channel', 'cost', 'date'])

# 按渠道分组,添加唯一活动计数列
df['campaignCount'] = df.groupby('channel')['campaignId'].transform('nunique')

运行后,Display渠道的所有行都会得到campaignCount=2(因为该渠道有2个唯一的campaignId),Search渠道的行则是campaignCount=1,完全对应到各自的分组。

2. 按月份分组

首先需要把date列转换成datetime类型,然后提取年月维度,再用同样的transform方法:

# 先把date列转为datetime类型
df['date'] = pd.to_datetime(df['date'])
# 提取年月(格式如'2021-06')
df['month'] = df['date'].dt.to_period('M')
# 按月份分组计算唯一活动数
df['campaignCount'] = df.groupby('month')['campaignId'].transform('nunique')

这样每一行都会得到对应月份下的唯一活动总数,比如2021年6月的所有行,campaignCount都是3(因为该月有3个唯一的campaignId)。

3. 同时按月份和渠道分组

如果需要组合两个维度分组,只需要把分组键改成列表即可:

# 确保date是datetime类型,提取年月
df['date'] = pd.to_datetime(df['date'])
df['month'] = df['date'].dt.to_period('M')
# 按月份+渠道组合分组
df['campaignCount'] = df.groupby(['month', 'channel'])['campaignId'].transform('nunique')

此时,2021-06+Display的行campaignCount=2,2021-06+Search的行campaignCount=1,精准匹配每个组合分组的结果。

备选方案:用merge实现

如果你更习惯先计算分组统计再合并,也可以用merge方法:

# 先计算渠道分组的统计结果,重置索引转为DataFrame
grouped_stats = df.groupby('channel')['campaignId'].nunique().reset_index(name='campaignCount')
# 合并回原DataFrame
df = df.merge(grouped_stats, on='channel', how='left')

这种方法同样能达到效果,适合需要单独查看分组统计结果的场景。

需要注意的小细节:如果你的date列原本是字符串格式,一定要先转成datetime类型,否则无法正确提取月份哦!

内容的提问来源于stack exchange,提问作者00robinette

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 23:12:38