Python 根据条件在数据帧中的列中生成值,并向下复制粘贴值

Python 根据条件在数据帧中的列中生成值,并向下复制粘贴值,python,pandas,dataframe,Python,Pandas,Dataframe,我想在我的数据集中创建两个新列(AA&BB),根据a或B中的值的条件(is=1)以及C中的条件填充。AA只查看a和C,BB只查看B和C。如果满足条件,则值1将打印在AA或BB列中,直到被C中的条件中断 在下面的A列示例中,索引1满足该条件,并在AA列中打印1,直到索引4,其中在C列中可以找到1,这否定了先前的条件,并恢复打印0。索引6中的B列也是如此,它在索引9处被C列中的条件中断 index A B C AA BB 0 0 0 0 0 0 1

我想在我的数据集中创建两个新列(AA&BB),根据a或B中的值的条件(is=1)以及C中的条件填充。AA只查看a和C,BB只查看B和C。如果满足条件,则值1将打印在AA或BB列中,直到被C中的条件中断

在下面的A列示例中,索引1满足该条件,并在AA列中打印1,直到索引4,其中在C列中可以找到1,这否定了先前的条件,并恢复打印0。索引6中的B列也是如此,它在索引9处被C列中的条件中断

index   A   B   C   AA  BB
0       0   0   0   0   0
1       1   0   0   1   0
2       0   0   0   1   0
3       0   0   0   1   0
4       0   0   1   0   0
5       0   0   0   0   0
6       0   1   0   0   1
7       0   0   0   0   1
8       0   0   0   0   1
9       0   0   1   0   0
我在网上找到了下面的解决方案,但它似乎不起作用

for i, b in enumerate(df.iterrows()):
        if b[1]['A'] == 1.0:
            AA = 1            
        elif b[1]['B'] == 1.0:
            BB = 1
        elif b[1]['C'] == 1.0:
            AA = 0
            BB = 0
        df.loc[i]['AA'] = AA
        df.loc[i]['BB'] = BB

编辑:发现C值未正确设置AA和BB为零的打字错误。

让我们试试这个。使用
idxmax
查找第一个
1
出现在
A
B
中的索引。使用它们对
A
-
C
B
-
C
进行切片。接下来,
cumsum
并将负值剪裁到
0
并分配到
AA
BB
。最后,
fillna
并转换为
int

i_a = df.A.idxmax()
i_b = df.B.idxmax()
df['AA'] = (df.A - df.C).loc[i_a:].cumsum().clip(lower=0)
df['BB'] = (df.B - df.C).loc[i_b:].cumsum().clip(lower=0)
df.loc[:, ['AA', 'BB']] = df.loc[:, ['AA', 'BB']].fillna(0).astype(int)

Out[1844]:
   index  A  B  C  AA  BB
0  0      0  0  0  0   0
1  1      1  0  0  1   0
2  2      0  0  0  1   0
3  3      0  0  0  1   0
4  4      0  0  1  0   0
5  5      0  0  0  0   0
6  6      0  1  0  0   1
7  7      0  0  0  0   1
8  8      0  0  0  0   1
9  9      0  0  1  0   0

如果A在C
1
之后有第二个
1
,会发生什么情况?也就是说,如果索引
7
A
1
,则
AA
的值是多少?使用if语句代替ELIF语句。如果满足第一个条件,它将移动到下一行,因此不会解决第三个elifstatement@AndyL. 如果A有第二个1,则需要重复此过程,例如,将A 1放入AA列并开始复制粘贴,直到它满足C条件而中断为止。@BramvanHoutI使用if语句尝试了它,但不幸地得到了相同的结果。代码工作(例如)没有错误,但AA或BB中也没有值
i_a = df.A.idxmax()
i_b = df.B.idxmax()
df['AA'] = (df.A - df.C).loc[i_a:].cumsum().clip(lower=0)
df['BB'] = (df.B - df.C).loc[i_b:].cumsum().clip(lower=0)
df.loc[:, ['AA', 'BB']] = df.loc[:, ['AA', 'BB']].fillna(0).astype(int)

Out[1844]:
   index  A  B  C  AA  BB
0  0      0  0  0  0   0
1  1      1  0  0  1   0
2  2      0  0  0  1   0
3  3      0  0  0  1   0
4  4      0  0  1  0   0
5  5      0  0  0  0   0
6  6      0  1  0  0   1
7  7      0  0  0  0   1
8  8      0  0  0  0   1
9  9      0  0  1  0   0