Python 根据条件在数据帧中的列中生成值,并向下复制粘贴值
我想在我的数据集中创建两个新列(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列中的条件中断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
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