【问题标题】:Calculate Distinct Count in rolling 3 Days Pandas?计算滚动 3 天熊猫的不同计数?
【发布时间】:2021-08-20 17:33:21
【问题描述】:

我想统计按城市分组的 3 天窗口内的唯一客户

输入:

    df = pd.DataFrame([['1A', 'Cairo', '2020-12-01'],
                ["2A", 'Cairo', '2020-12-01'],
                ['1A', 'Cairo', '2020-12-02'],
                ['1A', 'Cairo', '2020-12-03'],
                ['3A', 'Alex', '2020-12-01'],
                ['3A', 'Alex', '2020-12-02'],
                ['3A', 'Alex', '2020-12-03'],
                ['4A', 'Giza', '2020-12-02'],
                ['4A', 'Giza', '2020-12-02'],
                ['5A', 'Giza', '2020-12-03'],
                ['6A', 'Giza', '2020-12-01']], columns=
    ['customer_id', 'city', 'day'])

预期输出:

    output = pd.DataFrame([['Alex', '2020-12-01',1],
                ['Alex', '2020-12-02',1],
                ['Alex', '2020-12-03',1],
                ['Cairo', '2020-12-01',2],
                ['Cairo', '2020-12-02',2],
                ['Cairo', '2020-12-03',2],
                ['Giza', '2020-12-01',1],
                ['Giza', '2020-12-02',2],
                ['Giza', '2020-12-03',3]], columns=
    ['city', 'day', 'unique_customers_last3Days'])

我试过了:

df['day'] = pd.to_datetime(df['day'])
df.set_index('day',inplace=True)
df.sort_index(inplace=True)
df.groupby('city').rolling("3D").agg({'customer_id':'nun'})

但它给了我错误

AttributeError: 'nunique' is not a valid function for 'RollingGroupby' object

【问题讨论】:

    标签: python-3.x pandas distinct-values


    【解决方案1】:

    将数据框的索引设置为day,然后将sort设置为索引值,现在factorizecustomer_id列,以便为每个客户ID分配唯一的代码,然后group@上的数据框987654326@ 和 apply rolling nunique 操作,窗口大小为 3 days。 (可选)dropday 中每个 city 的重复值

    df = df.set_index('day').sort_index()
    df['codes'] = df['customer_id'].factorize()[0]
    
    df.groupby('city')\
      .rolling('3D')['codes'].apply(pd.Series.nunique)\
      .reset_index(name='unique').drop_duplicates(['city', 'day'], keep='last')
    

         city        day  unique
    0    Alex 2020-12-01     1.0
    1    Alex 2020-12-02     1.0
    2    Alex 2020-12-03     1.0
    4   Cairo 2020-12-01     2.0
    5   Cairo 2020-12-02     2.0
    6   Cairo 2020-12-03     2.0
    7    Giza 2020-12-01     1.0
    9    Giza 2020-12-02     2.0
    10   Giza 2020-12-03     3.0
    

    【讨论】:

    • @SamehMostafa 这回答了你的问题吗?
    • 太棒了!它有效,谢谢你我只有一个问题,你为什么要进行分解步骤?那是因为ID不是数字吗?我的意思是如果我有 ID 作为数字,我应该执行分解步骤吗?
    • Pandas rolling 方法仅适用于具有数字数据类型的列,因此为了将 customer_id 转换为序数类型,我们使用了 factorization 步骤。如果您已经在ID 列中找到了数字,您绝对可以跳过分解步骤。
    • 非常感谢
    • 很高兴我能帮上忙!
    猜你喜欢
    • 2018-07-10
    • 2019-11-19
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    相关资源
    最近更新 更多