df.loc超过2个条件

时间:2019-01-17 11:19:06

标签: python pandas dataframe

我有一个这样的熊猫数据框:

df = pd.DataFrame({"A": [1, 2, 3, 4, 5, 6], "B": [100, 200, 300, 400, 500, 
600]})

如果要满足某些条件,我想创建一个具有某些值的新列。问题是:这些是&|的多个条件。我知道我只能在两个条件下执行此操作,然后再进行多个df.loc调用,但是由于我的实际数据集非常庞大,因此变量可以采用许多不同的值,因此我想知道是否可以执行此操作在一次df.loc通话中。我之前也尝试过np.where,但是发现df.loc通常比较容易,因此如果我坚持使用它会很好。

我尝试的代码是

df.loc[(df.A == 1) | (df.A == 2) & (df.B == 600) | (df.B == 200), "C"] = 
"1or2and600or200"

这给了我

print(df)  
   A    B                C
0  1  100  1or2and600or200
1  2  200  1or2and600or200
2  3  300              NaN
3  4  400              NaN
4  5  500              NaN
5  6  600              NaN

但这不是我想要的,因为df.loc可能仅考虑前两个条件。因此,在此代码示例中,我希望值1or2and600or200仅出现在第一行,而不是第二行。这可能吗?

非常感谢。

1 个答案:

答案 0 :(得分:6)

很好,除了您需要多加括号。

df.loc[((df.A == 1) | (df.A == 2)) & ((df.B == 600) | (df.B == 200)), "C"] = "1or2and600or200"

您也可以继续使用.isin,以获得@AndrewF引用的更清晰简洁的图片

df.loc[df.A.isin([1, 2]) & df.B.isin([600, 200]), 'C'] = "1or2and600or200"

对于给定的条件,它也将出现在第二行,因为它是您在200中有B的地方