如何高效统计每月各推广渠道中值>0的唯一ID数量?
问题描述
我正在处理一个推广DataFrame,结构示例如下:
| ID | Yrmo | Views | Store Visits | |
|---|---|---|---|---|
| 1 | Jan-21 | 1 | 2 | 0 |
| 1 | Feb-21 | 1 | 1 | 1 |
| 2 | Jan-21 | 2 | 5 | 0 |
| 2 | Feb-21 | 4 | 1 | 2 |
该DataFrame包含50余个推广列和超百万行数据,我需要统计每月中,各推广渠道对应值大于0的唯一ID数量。
原本采用以下for循环方式实现:
cols = df.columns[2:].to_list() df_month = pd.DataFrame(df['Yrmo'].unique()) df_month.columns = 'Yrmo' for i in cols: temp_df = df[df[i]>0] df_grouped = temp_df.pivot_table(index = ['Yrmo'], values = ['ID'], aggfunc = 'nunique') df_grouped = df_grouped.reset_index() df_grouped.rename(columns = {'ID':i},inplace=True) df_month = df_month.merge(df_grouped, on = ['Yrmo'], how = 'left').fillna(0) if df_grouped.shape[0]==0: df_month[i] = 0
但由于数据量较大,该方法耗时过长,请问是否有更高效的实现方式?
高效实现方案
直接用向量化操作+分组聚合替代循环,避免多次创建临时DataFrame和merge操作,能大幅提升效率:
代码实现
# 提取所有推广列 promo_cols = df.columns[2:] # 1. 标记各推广列是否有有效数据(值>0) df_bool = df[['ID', 'Yrmo']].join(df[promo_cols] > 0) # 2. 按月份+ID分组,保留每个ID在当月各渠道的有效状态(只要有一次>0就算有效) df_id_month = df_bool.groupby(['Yrmo', 'ID']).max().reset_index() # 3. 按月份分组,统计每个渠道的有效唯一ID数量 result = df_id_month.groupby('Yrmo')[promo_cols].sum().reset_index()
方案说明
- 全程无循环,利用pandas内置的向量化运算和分组优化逻辑,处理百万级数据的速度比原循环方法提升数倍
- 输出结果结构和原代码完全一致:每行对应一个月份,每列对应一个推广渠道,值为该渠道当月的有效唯一ID数
内容的提问来源于stack exchange,提问作者Mufeez
相关产品推荐
相关产品推荐

