如何根据每个组的前一行值应用条件处理



我有一个如下表:

坏//tr>//tr>yy
帐户
a 1
2 y
a 3
a 4
a 5 y
b 1
b 2
b 3
b 4

一种可能的解决方案,基于将上一次有效观测向前传播到下一次有效(pandas.DataFrame.ffill(的想法:

df['been_bad'] = df.groupby('account')['bad'].ffill()
print(df)

输出:

account  month  bad been_bad
0       a      1  NaN      NaN
1       a      2    y        y
2       a      3  NaN        y
3       a      4  NaN        y
4       a      5    y        y
5       b      1  NaN      NaN
6       b      2    y        y
7       b      3    y        y
8       b      4  NaN        y

您可以创建一个boolean掩码来查找y,然后使用argmax和切片来传播该值:

从这个扩展数据开始

account  month bad 
0        a      1     
1        a      2   y 
2        a      3     
3        a      4     
4        a      5   y 
5        b      1     
6        b      2   y 
7        b      3   y 
8        b      4     
9        c      1     
10       c      2     
11       c      3     
12       c      4     

功能定义

def f(x, bad='y'):
m = (x==bad)

if m.any():
rc = x.copy()  # Don't modify the passed arg
rc.iloc[m.argmax():] = rc.iat[m.argmax()]
return rc

return x

执行

df['been_bad'] = df.groupby('account')['bad'].apply(f)
print(df)

结果

account  month bad been_bad
0        a      1             
1        a      2   y        y
2        a      3            y
3        a      4            y
4        a      5   y        y
5        b      1             
6        b      2   y        y
7        b      3   y        y
8        b      4            y
9        c      1             
10       c      2             
11       c      3             
12       c      4             

最新更新