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

如何在Pandas中按ID统计唯一user/date组合数并添加列?

问题描述

现有如下Pandas DataFrame:

import pandas as pd
df = pd.DataFrame({'id':[1,1,2,2,3], 
                   'user':['u1', 'u1', 'u2', 'u2', 'u3'],
                   'date':['2021-04-25','2021-04-25','2021-04-25','2021-04-26', '2021-04-25'],
                   'sth_else1':['xx','yy','xx','xx','xx'], 'sth_else2':['zz','yy','zz','xx','xx']})

原始数据展示:

id   user    date    sth_else1   sth_else2
0   1   u1  2021-04-25  xx          zz
1   1   u1  2021-04-25  yy          yy
2   2   u2  2021-04-25  xx          zz
3   2   u2  2021-04-26  xx          xx
4   3   u3  2021-04-25  xx          xx

需要为该DataFrame添加一列count_per_id_user_and_date,用于展示每个id对应的唯一user/date组合的数量,最终结果如下:

id   user    date    sth_else1   sth_else2   count_per_id_user_and_date
0   1   u1  2021-04-25  xx          zz          1
1   1   u1  2021-04-25  yy          yy          1
2   2   u2  2021-04-25  xx          zz          2
3   2   u2  2021-04-26  xx          xx          2
4   3   u3  2021-04-25  xx          xx          1
解决方案

可以通过groupby结合transform方法实现,以下提供两种简洁的写法:

方法一:直接对分组内的多列去重统计

df['count_per_id_user_and_date'] = df.groupby('id')[['user', 'date']].transform(
    lambda group: group.drop_duplicates().shape[0]
)

逻辑:按id分组后,对每个分组内的user和date列组合去重,统计去重后的行数(即该id对应的唯一user/date组合数),再通过transform将结果映射回原DataFrame的每一行。

方法二:先拼接组合列再统计唯一值

# 临时拼接user和date为单一组合列
df['user_date'] = df['user'] + '_' + df['date']
# 按id分组统计该组合列的唯一值数量
df['count_per_id_user_and_date'] = df.groupby('id')['user_date'].transform('nunique')
# 可选:删除临时列
df.drop('user_date', axis=1, inplace=True)

逻辑:先将user和date拼接成一个新列,让每一个唯一的user/date组合对应新列的一个唯一值,再用nunique统计每个id下的唯一值数量,最后通过transform映射回原表。

两种方法都能得到目标结果,可根据个人习惯选择。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 09:24:52