如何为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
相关产品推荐
相关产品推荐

