Python 有没有一种方法可以在熊猫身上做到这一点而不使用循环?

Python 有没有一种方法可以在熊猫身上做到这一点而不使用循环?,python,pandas,data-science,Python,Pandas,Data Science,开始时我的df: A B C D A1 1 0 True A2 1 0 False A3 1 0 True 输出(不再需要D列): 因此,对于df中的每一行,如果D中为真,则将B的值增加1,否则将C的值增加1。您可以使用创建新的df,并将其添加到原始数据的子集: df[['B','C']] = df[['B','C']] + pd.concat([df['D'], ~df['D']], 1, keys=['B','C']) print (df)

开始时我的df:

A   B   C   D
A1  1   0   True
A2  1   0   False
A3  1   0   True
输出(不再需要D列):


因此,对于df中的每一行,如果D中为真,则将B的值增加1,否则将C的值增加1。

您可以使用创建新的
df
,并将其添加到原始数据的子集:

df[['B','C']] = df[['B','C']] + pd.concat([df['D'], ~df['D']], 1, keys=['B','C'])
print (df)
    A  B  C      D
0  A1  2  0   True
1  A2  1  1  False
2  A3  2  0   True
或使用
loc

df.loc[df['D'], 'B'] +=  1
df.loc[~df['D'], 'C'] +=  1
print (df)
    A  B  C      D
0  A1  2  0   True
1  A2  1  1  False
2  A3  2  0   True
或使用和:

最后删除列:

df = df.drop('D', axis=1)
print (df)
    A  B  C
0  A1  2  0
1  A2  1  1
2  A3  2  0

在这里提问时显示现有代码被认为是一种很好的形式。@IanS:谢谢你让我知道这一点。我将从下一次开始关注这一点。谢谢:)如果输入是这样的话,这不会给出正确的输出:dict3={'A':['A','b','c','b':[1,0,0],'c':[0,0,1],'D':[True,False,False]}如果输入是这样的话,这不会给出正确的输出:dict3={'A':['A','b','c','b':[1,0,0],'c':[0,0,1],'D':[True,False,False]}。我得到的输出是这样的:`abcd0a20true 1b01false 2c02false`但预期的输出是`abcd0a20true 1b01错误2 c 0错误1感谢您的评论。我有点困惑,因为问题是
如果D中有True,那么将B的值增加1,否则将C的值增加1。
这正是我的答案。但是你的输出是不同的,你能解释更多吗?或者遗漏了什么?我的意思是,如果每行D中有一个真值,那么增加B(同一行)的值,或者增加C(同一行)的值。我不明白-第一行是真的,所以B从1变为2。在第二行中,False,C是从0更改为1,在最后一行中,False,所以在C 1中更改为2。这是错的吗?
df['B'] = df['B'] + df['D']
df['C'] = df['C'] + (~df['D'])

print (df)
    A  B  C      D
0  A1  2  0   True
1  A2  1  1  False
2  A3  2  0   True
df = df.drop('D', axis=1)
print (df)
    A  B  C
0  A1  2  0
1  A2  1  1
2  A3  2  0