Python 基于另一列的条件ffill

Python 基于另一列的条件ffill,python,pandas,Python,Pandas,我试图有条件地ffill一个值,直到第二列遇到一个值,然后重置第一列值。实际上,第一列是一个“开”开关,直到“关”开关(第二列)遇到一个值为止。我还没有一个使用ffill和where的工作示例 输入示例: Index Start End 0 0 0 1 0 0 2 1 0 3 0 0 4 0 0 5 0 0 6 0 1 7

我试图有条件地ffill一个值,直到第二列遇到一个值,然后重置第一列值。实际上,第一列是一个“开”开关,直到“关”开关(第二列)遇到一个值为止。我还没有一个使用ffill和where的工作示例

输入示例:

Index   Start   End
0       0       0
1       0       0
2       1       0
3       0       0
4       0       0
5       0       0
6       0       1
7       0       0
8       1       0
9       0       0
10      0       0
11      0       0
12      0       1
13      0       1
14      0       0
期望输出:

Index   Start   End
0       0       0
1       0       0
2       1       0
3       1       0
4       1       0
5       1       0
6       1       1
7       0       0
8       1       0
9       1       0
10      1       0
11      1       0
12      1       1
13      0       1
14      0       0
编辑:

处理基于另一列设置的值时会出现问题。逻辑如下:开始应为零,直到R列低于25,然后为正,直到R列高于80,循环应重复。然而,在第13行,Start被莫名其妙地设置为1,尽管不符合标准

df = pd.DataFrame(np.random.randint(0, 100, size=100), columns=['R'])
df['Start'] = np.where((df.R < 25), 1, 0)
df['End'] = np.where((df.R > 80), 1, 0)
df.loc[df['End'].shift().eq(0), 'Start'] = df['Start'].replace(0, np.nan).ffill().fillna(0).astype(int)
尝试:

[外]


我已经编辑了这个问题,并提供了一个更详细的问题示例。
“在索引
10
处的R列低于20之前,开始应为零,
R
24
。”。。?为什么在这种情况下“开始”是1?我的错,它应该说明“R列低于25”。这个很棘手。我的建议是用经过编辑的解释和样本数据来回答一个新问题。这样,您将从其他人那里获得更高的可视性和更好的解决方案。
        R   Start  End
0       58  0       0
1       98  0       1
2       91  0       1
3       69  0       0
4       55  0       0
5       57  0       0
6       64  0       0
7       75  0       1
8       78  0       1
9       90  0       1
10      24  1       0
11      89  1       1
12      36  0       0
13      70  **1**   0

df.loc[df['End'].shift().eq(0), 'Start'] = df['Start'].replace(0, np.nan).ffill().fillna(0).astype(int)
    Start  End
0       0    0
1       0    0
2       1    0
3       1    0
4       1    0
5       1    0
6       1    1
7       0    0
8       1    0
9       1    0
10      1    0
11      1    0
12      1    1
13      0    1
14      0    0