Python 基于其他列值创建新列-条件正向填充?

Python 基于其他列值创建新列-条件正向填充?,python,pandas,dataframe,Python,Pandas,Dataframe,具有以下数据帧 d = {'c_1': [0,0,0,1,0,0,0,1,0,0,0,0], 'c_2': [0,0,0,0,0,1,0,0,0,0,0,1]} df = pd.DataFrame(d) 我想创建另一列“f”,当c_1==1时返回1,直到c_2==1,在这种情况下,“f”中的值将为0 c_1 c_2 f 0 0 1 0 1 0 1 0 2 0 1 0 3 0 0 0 4 0 0 0 5 0

具有以下数据帧

d = {'c_1': [0,0,0,1,0,0,0,1,0,0,0,0],
     'c_2': [0,0,0,0,0,1,0,0,0,0,0,1]}

df = pd.DataFrame(d)
我想创建另一列“f”,当
c_1==1
时返回1,直到
c_2==1
,在这种情况下,“f”中的值将为0

   c_1  c_2 f
0   0   1   0
1   0   1   0
2   0   1   0
3   0   0   0
4   0   0   0
5   0   0   0
6   1   0   1
7   0   0   1
8   0   1   0
9   0   1   0
10  0   1   0
11  0   1   0
12  0   1   0
13  0   0   0
14  0   0   0
15  0   0   0
16  1   0   1
17  0   0   1
18  1   0   1
19  1   0   1
20  0   0   1
21  0   0   1
22  0   0   1
23  0   0   1
24  0   1   0
所需输出如下

    c_1 c_2 f
0   0   0   0
1   0   0   0
2   0   0   0
3   1   0   1
4   0   0   1
5   0   1   0
6   0   0   0
7   1   0   1
8   0   0   1
9   0   0   1
10  0   0   1
11  0   1   0
考虑到这需要某种有条件的向前填充,查看前面的问题,但无法获得所需的输出

编辑:遇到了一个相关场景,其中输入不同,当前解决方案不起作用。将确认回答,但感谢您提供以下信息

d = {'c_1': [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0],
     'c_2': [1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]}

df = pd.DataFrame(d)
所需的输出如下-与我想创建的前一列相同,另一列“f”在
c_1==1
直到
c_2==1
时返回1,在这种情况下,“f”中的值将为0

   c_1  c_2 f
0   0   1   0
1   0   1   0
2   0   1   0
3   0   0   0
4   0   0   0
5   0   0   0
6   1   0   1
7   0   0   1
8   0   1   0
9   0   1   0
10  0   1   0
11  0   1   0
12  0   1   0
13  0   0   0
14  0   0   0
15  0   0   0
16  1   0   1
17  0   0   1
18  1   0   1
19  1   0   1
20  0   0   1
21  0   0   1
22  0   0   1
23  0   0   1
24  0   1   0
您可以尝试:

df['f'] = df[['c_1','c_2']].sum(1).cumsum().mod(2)


您也可以这样尝试:

df.loc[df['c_2'].shift().ne(1), 'f'] = df['c_1'].replace(to_replace=0, method='ffill')


    c_1 c_2 f
0   0   0   0.0
1   0   0   0.0
2   0   0   0.0
3   1   0   1.0
4   0   0   1.0
5   0   1   1.0 # <--- set these value to be zero
6   0   0   NaN
7   1   0   1.0
8   0   0   1.0
9   0   0   1.0
10  0   0   1.0
11  0   1   1.0 # <---

啊,我也在想同样的问题,但是你已经用
cumcount
回答了,这是一个很好的解决方案。没有想到结合使用cumcount()和mod(2)。谢谢你的提示。我将尝试其他几个例子,以便我能很好地掌握它的有趣的方法。我也会试试这个。向上投票。
df.loc[df['c_2'].shift().ne(1) & df['c_2'].ne(1), 'f'] = df['c_1'].replace(to_replace=0, method='ffill')
df = df.fillna(0)

    c_1 c_2 f
0   0   0   0.0
1   0   0   0.0
2   0   0   0.0
3   1   0   1.0
4   0   0   1.0
5   0   1   0.0
6   0   0   0.0
7   1   0   1.0
8   0   0   1.0
9   0   0   1.0
10  0   0   1.0
11  0   1   0.0