df.loc超过2个条件

The*_*849 3 python dataframe pandas

我有一个像这样的pandas数据帧:

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

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

我试过的代码是

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

这给了我

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
Run Code Online (Sandbox Code Playgroud)

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

非常感谢.

meW*_*meW 7

一切都很好,除了你需要照顾额外的括号.

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

您还可以继续.isin查看@AndrewF所提及的更清晰简洁的图片

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

另外,您给定的条件,它会出现在第二排,因为这就是你必须200B

  • 只是一个小小的说明OP也可以使用[`.isin(...)`](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.isin.html)稍微清洁条件.即`df.A.isin([1,2])&df.B.isin([600,200])` (2认同)