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

如何高效统计每月各推广渠道中值>0的唯一ID数量?

问题描述

我正在处理一个推广DataFrame,结构示例如下:

IDYrmoViewsWhatsappStore Visits
1Jan-21120
1Feb-21111
2Jan-21250
2Feb-21412

该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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 11:42:26