问题描述
我有以下数据框。
y = pd.DataFrame(np.zeros((10,1),dtype = 'bool'),columns = ['A'])
y.iloc[[3,5],0] = True
A
0 False
1 False
2 False
3 True
4 False
5 True
6 False
7 False
8 False
9 False
我想为接下来的三行设置为 'True',从上面的数据框中找到 'True' 的位置开始。预期结果如下所示。
A
0 False
1 False
2 False
3 True
4 True
5 True
6 True
7 True
8 False
9 False
我可以通过以下方式做到这一点,但我想知道是否有更聪明的方法来做到这一点。
y['B'] = y['A'].shift()
y['C'] = y['B'].shift()
y['D'] = y.any(axis = 1)
y['A'] = y['D']
y = y['A']
提前感谢您的帮助。
解决方法
我使用参数 limit
向前填充缺失值,将 False
替换为缺失值,最后将 NaN
替换为 False
:
y.A = y.A.replace(False,np.nan).ffill(limit=2).fillna(False)
print (y)
A
0 False
1 False
2 False
3 True
4 True
5 True
6 True
7 True
8 False
9 False
使用 Rolling.apply
和 any
测试每个窗口至少一个 True
的另一个想法:
y.A = y.A.rolling(3,min_periods=1).apply(lambda x: x.any()).astype(bool)