代码之家  ›  专栏  ›  技术社区  ›  Eleanor

熊猫根据按列分组的指标计算差异

  •  2
  • Eleanor  · 技术社区  · 7 年前

    这是我的问题。我不知道怎么形容,所以我就举个例子。

    a b k
    0 0 0
    0 1 1
    0 2 0
    0 3 0
    0 4 1
    0 5 0
    1 0 0
    1 1 1
    1 2 0
    1 3 1
    1 4 0
    

    这里,“a”是用户id,“b”是时间,“k”是二进制指示符标志。B”是连续的。 我想得到的是:

    a b k diff_b
    0 0 0 nan
    0 1 1 nan
    0 2 0 1
    0 3 0 2
    0 4 1 3
    0 5 0 1
    1 0 0 nan
    1 1 1 nan
    1 2 0 1
    1 3 1 2
    1 4 0 1
    

    所以diff是一个时间差变量。它显示当前时间点和带有操作的最后时间点之间的持续时间。如果以前从未有过操作,则返回nan。此差异b按a分组。对于每个用户,此差异b是独立计算的。

    有人能修改我的头衔吗?我不知道如何用英语来形容它。太复杂了…

    谢谢您!

    2 回复  |  直到 7 年前
        1
  •  3
  •   BENY    7 年前

    小精灵

    df['New']=df.b.loc[df.k==1]# get all value b when k equal to 1
    df.New=df.groupby('a').New.apply(lambda x : x.ffill().shift()) # fillna by froward method , then we need shift.
    df.b-df['New']# yield 
    Out[260]: 
    0     NaN
    1     NaN
    2     1.0
    3     2.0
    4     3.0
    5     1.0
    6     NaN
    7     NaN
    8     1.0
    9     2.0
    10    1.0
    dtype: float64
    
        2
  •  0
  •   Haleemur Ali    7 年前

    在后面创建行数据的分区 k == 1 一直到下一个 K=1 对每组使用cumsum和shift a

    parts = df.groupby('a').k.apply(lambda x: x.shift().cumsum())
    

    按分组 df.a 和; parts 计算两者之间的差额 b 和; b.min() 在每组中

    vals = df.groupby([df.a, parts]).b.apply(lambda x: x-x.min()+1)
    

    当part==0时将值设置为空,并将其分配回数据帧

    df['diff_b'] = np.select([parts!=0], [vals], np.nan)
    

    输出:

        a  b  k  diff_b
    0   0  0  0     NaN
    1   0  1  1     NaN
    2   0  2  0     1.0
    3   0  3  0     2.0
    4   0  4  1     3.0
    5   0  5  0     1.0
    6   1  0  0     NaN
    7   1  1  1     NaN
    8   1  2  0     1.0
    9   1  3  1     2.0
    10  1  4  0     1.0