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