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

