计算pandas中groupby的nunique()。[英] Calculate nunique() for groupby in pandas

本文是小编为大家收集整理的关于计算pandas中groupby的nunique()。的处理方法,想解了计算pandas中groupby的nunique()。的问题怎么解决?计算pandas中groupby的nunique()。问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我有一个带有列的数据框:

  1. diff - 注册日期和付款日期之间的差异,以天为单位
  2. country - 用户所在国家/地区
  3. user_id
  4. campaign_id -- 另一个分类列,我们将在 groupby 中使用它

我需要计算每个 country+campaign_id 组具有 diff<=n 的不同用户的数量.例如,对于 country 'A'、campaign 'abc' 和 diff 7 我需要从 country 'A'、campaign 'abc' 和 diff 中获取不同用户的数量<= 7

我当前的解决方案(如下)工作时间过长

import pandas as pd
import numpy as np

## generate test dataframe
df = pd.DataFrame({
        'country':np.random.choice(['A', 'B', 'C', 'D'], 10000),
        'campaign': np.random.choice(['camp1', 'camp2', 'camp3', 'camp4', 'camp5', 'camp6'], 10000),
        'diff':np.random.choice(range(10), 10000),
        'user_id': np.random.choice(range(1000), 10000)
        })
## main
result_df = pd.DataFrame()
for diff in df['diff'].unique():
    tmp_df = df.loc[df['diff']<=diff,:]
    tmp_df = tmp_df.groupby(['country', 'campaign'], as_index=False).apply(lambda x: x.user_id.nunique()).reset_index()
    tmp_df['diff'] = diff
    tmp_df.columns=['country', 'campaign', 'unique_ppl', 'diff']
    result_df = pd.concat([result_df, tmp_df],ignore_index=True, axis=0)

也许有更好的方法来做到这一点?

推荐答案

首先使用列表推导式concatassign 用于连接所有,然后 groupby 与 nunique 添加列 diff,最后重命名列,如有必要,添加 reindex 用于自定义列顺序:

df1 = pd.concat([df.loc[df['diff']<=x].assign(diff=x) for x in  df['diff'].unique()])
df2 = (df1.groupby(['diff','country', 'campaign'], sort=False)['user_id']
          .nunique()
          .reset_index()
          .rename(columns={'user_id':'unique_ppl'})
          .reindex(columns=['country', 'campaign', 'unique_ppl', 'diff']))

本文地址:https://www.itbaoku.cn/post/1728063.html