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

jvidinwx  于 2023-06-20  发布在  其他
关注(0)|答案(3)|浏览(136)

具有以下 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   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
mqxuamgl

mqxuamgl1#

您可以尝试:

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

    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
5cnsuln7

5cnsuln72#

你也可以这样尝试:

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 # <---

多加一行。如果你不想包括结束位置。

最终:

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
ttygqcqt

ttygqcqt3#

这应该适用于以下两种情况:

df['c_1'].groupby(df[['c_1','c_2']].sum(1).cumsum()).transform('first')

df['c_1'].map({1:True}).fillna(df['c_2'].map({1:False})).ffill().fillna(False).astype(int)

相关问题