我有一个如下表:
帐户 | 月 | 坏|
---|---|---|
a | 1 | //tr>|
2 | y | |
a | 3 | |
a | 4 | |
a | 5 | y |
b | 1 | //tr>|
b | 2 | y|
b | 3 | y|
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