基于r_no按用户与value聚合唯一cam_id的数值统计需求
高效处理百万级Pandas数据:基于r_no统计唯一cam_id聚合结果
嘿,我来帮你搞定这个百万级数据的统计需求!首先咱们先明确你的场景:你有一个百万行的DataFrame,需要基于r_no,统计同一value下用户打开的唯一cam_id的聚合结果,之前用groupby时觉得复杂度上升,对吧?
先看你的示例数据:
import pandas as pd df = pd.DataFrame() df['r_no'] = [1,1,1,2,3,1,1,1,2] df['user'] = ['sam','sam','sam','sam','peter','jack','jack','Kris','peter'] df['value'] = [76,76,7,8,8,2,29,2,8] df['cam_id'] = ['ab','abc','ab','ab','ab','abcd','abcd','abcd','ab']
针对百万级数据,咱们必须用Pandas内置的矢量化聚合操作,避免自定义apply(因为apply会逐组跑Python代码,速度慢很多)。下面分两种常见需求给你解决方案:
需求1:统计每个(r_no, value)组下,各用户唯一cam_id的数量之和
也就是先算每个用户在该r_no+value下打开过多少种唯一的cam_id,再把这些数加起来,得到该r_no+value的总计数:
# 第一步:按r_no、value、user分组,计算每个用户的唯一cam_id数量 user_level_unique = df.groupby(['r_no', 'value', 'user'])['cam_id'].nunique() # 第二步:按r_no、value聚合,求和得到总数 final_result = user_level_unique.groupby(['r_no', 'value']).sum()
运行后,示例数据的结果会是:
r_no value 1 2 2 7 1 29 1 76 2 2 8 2 3 8 1 Name: cam_id, dtype: int64
需求2:统计每个(r_no, value)组下,所有用户打开过的唯一cam_id总个数(跨用户去重)
也就是不管哪个用户,只要是该r_no+value下出现过的cam_id,只算一次:
final_result = df.groupby(['r_no', 'value'])['cam_id'].nunique()
示例数据的结果是:
r_no value 1 2 1 7 1 29 1 76 2 2 8 1 3 8 1 Name: cam_id, dtype: int64
扩展:多指标聚合
如果需要同时统计多个指标(比如唯一cam数、不同用户数、总记录数),可以用agg方法,同样高效:
final_result = df.groupby(['r_no', 'value']).agg( 唯一cam数量=('cam_id', 'nunique'), 不同用户数=('user', 'nunique'), 总记录数=('cam_id', 'count') )
这些方法都是Pandas底层优化过的C语言实现,处理百万行数据完全没问题,比自定义函数快几个数量级哦!
内容的提问来源于stack exchange,提问作者Nandha Kumar M
相关产品推荐
相关产品推荐

