【问题标题】:Pandas group by ID, filter by date range, and sum with two dataframesPandas 按 ID 分组,按日期范围过滤,并与两个数据框求和
【发布时间】:2021-04-28 22:46:14
【问题描述】:

我有两个数据框(df1 和 df2)。 df1 包含所有用户 ID、购买日期和购买金额:

index     user     date_1        value
0         a        2021-02-05    50.0
1         b        2021-02-20    12.0
2         a        2021-03-06    45.0
3         c        2021-03-05    30.0
4         c        2021-03-15    44.0
...       ...      ...           ...

df2 有用户 ID 和他们成为用户的日期:

index     user     date_2      
0         a        2021-02-05
1         b        2021-02-20
2         c        2021-03-06
3         d        2021-03-20
...       ...      ...

目标:我希望在 df2 中添加一个新列,用于汇总每个用户第一个月的交易价值。

我找到了以下线程:

Pandas group by then count sum...

但是,这会将所有内容都保存在一个数据框中,我在尝试混合 apply、lambda、groupby 和 sum 函数时迷失了方向。我已经进行了以下设置,但它为新列返回了不正确的值:

def f(x, y, t):
return x.apply(lambda y: x.loc[x['date_1'].between(y['date_2'],
                                                   y['date_2'] + t,
                                                    inclusive=False),'value'].sum(),axis=1)

df2['monthly_volume'] = df1.groupby('user', group_keys=False).
                                         apply(f, df2,
                                         pd.Timedelta(30, unit='D'))

最终,随着我获得更多数据,我还会查找用户在注册后的第二个月、第三个月等的购买量。除了修复它之外,也许还有更好的办法让它可重复。感谢您的帮助!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以进行布尔索引。例如:

    def get_sum(user, start_date, end_date):
        return df1.loc[
            (df1.user == user) & (df1.date_1.between(start_date, end_date)),
            "value",
        ].sum()
    
    
    df2["monthly_volume"] = df2.apply(
        lambda x: get_sum(
            x["user"], x["date_2"], x["date_2"] + pd.Timedelta(days=30)
        ),
        axis=1,
    )
    print(df2)
    

    打印:

      user     date_2  monthly_volume
    0    a 2021-02-05            95.0
    1    b 2021-02-20            12.0
    2    c 2021-03-06            44.0
    3    d 2021-03-20             0.0
    

    【讨论】:

      猜你喜欢
      • 2021-05-25
      • 2022-01-23
      • 2018-11-14
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      相关资源
      最近更新 更多