我有一个这样的熊猫数据框:
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
仅出现在第一行,而不是第二行。这可能吗?
非常感谢。
答案 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
的地方