【问题标题】:Dynamic aggregating in pandaspandas 中的动态聚合
【发布时间】:2018-11-13 12:13:32
【问题描述】:

我的原始数据框如下所示:

A           B   C
27/03/2018  u1  Yes 
28/03/2018  u2  Yes
02/04/2018  u2  No
04/04/2018  u1  Yes
05/04/2018  u1  No
10/04/2018  u2  Yes 
11/04/2018  u1  No
16/04/2018  u2  Yes
13/05/2018  u2  No

我想获得一个新列来执行此操作:在每一行中,它将说明在实际日期之前的 7 天内为 B 中的项目找到了多少“是”。 因此,在这个例子中,它看起来像这样:

A           B   C    D
27/03/2018  u1  Yes  0
28/03/2018  u2  Yes  0
02/04/2018  u2  No   1
04/04/2018  u1  Yes  1
05/04/2018  u1  No   1
10/04/2018  u2  Yes  0
11/04/2018  u1  No   1
16/04/2018  u2  Yes  1
13/05/2018  u2  No   0

我想获得另一列,但前 30 天的情况相同。我猜想弄清楚如何做 7 天会让剩下的事情变得更容易。

P.S :我也想这样做,但使用实际的几周而不是前几天(因此,对于 2018 年 1 月 6 日星期五,我们将考虑 5 月 21 日至 27 日这一周)。

如何做到这一点?

【问题讨论】:

    标签: python pandas grouping aggregate pandas-groupby


    【解决方案1】:

    IIUC 需要:

    def f(x):
        d = x['A'] - pd.Timedelta(7, unit='d')
        a = (df.A.between(d, x.A) & (df.B == x.B) & (df.C == 'Yes'))
        #print (df[a])
        return a.sum()
    
    df['new'] = df.apply(f, axis=1)
    print (df)
               A   B    C  new
    0 2018-03-27  u1  Yes    1
    1 2018-03-28  u2  Yes    1
    2 2018-02-04  u2   No    0
    3 2018-04-04  u1  Yes    1
    4 2018-05-04  u1   No    0
    5 2018-10-04  u2  Yes    1
    6 2018-11-04  u1   No    0
    7 2018-04-16  u2  Yes    1
    8 2018-05-13  u2   No    0
    

    编辑:

    week = df.A.dt.to_period('W')
    df['start'] = week.apply(lambda r: r.start_time) - pd.Timedelta(7, unit='d')
    df['end'] = week.apply(lambda r: r.end_time) + pd.Timedelta(1, unit='ns') - pd.Timedelta(8, unit='d')
    
    def f(x):
        return (df.A.between(x.start, x.end) & (df.B == x.B) & (df.C == 'Yes')).sum()
    
    df['new'] = df.apply(f, axis=1)
    print (df)
               A   B    C      start        end  new
    0 2018-03-27  u1  Yes 2018-03-19 2018-03-25    0
    1 2018-03-28  u2  Yes 2018-03-19 2018-03-25    0
    2 2018-02-04  u2   No 2018-01-22 2018-01-28    0
    3 2018-04-04  u1  Yes 2018-03-26 2018-04-01    1
    4 2018-05-04  u1   No 2018-04-23 2018-04-29    0
    5 2018-10-04  u2  Yes 2018-09-24 2018-09-30    0
    6 2018-11-04  u1   No 2018-10-22 2018-10-28    0
    7 2018-04-16  u2  Yes 2018-04-09 2018-04-15    0
    8 2018-05-13  u2   No 2018-04-30 2018-05-06    0
    

    【讨论】:

    • 感谢您的回答,它看起来确实不错,它回答了我问题的第一部分。如果我们不想要一个 7 天的滑动窗口而是一个 litteral week 条件,你认为它可以修改吗?例如,对于 2018 年 3 月 28 日,这是一个星期三,我们将在 03/19 到 03/25 之间进行搜索,即前一周。
    • @MhamedJabri - 我为 botween 添加了新列,请检查编辑后的答案。
    猜你喜欢
    • 2020-01-19
    • 2016-06-24
    • 2019-05-15
    相关资源
    最近更新 更多