在python中,如何为DataFrame中的所有移动行移动和填充特定值?

问题描述

我有以下数据框。

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.applyany 测试每个窗口至少一个 True 的另一个想法:

y.A = y.A.rolling(3,min_periods=1).apply(lambda x: x.any()).astype(bool)