【问题标题】:df.loc more than 2 conditionsdf.loc 2个以上条件
【发布时间】:2019-06-11 14:03:36
【问题描述】:

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

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 仅在第一行中,而不是在第二行中。这可能吗?

非常感谢。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    一切都好,除了你需要注意额外的括号。

    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"
    

    此外,对于您的给定条件,它将出现在第二行,因为它是您在B 中拥有200 的位置

    【讨论】:

    • 请注意,OP 也可以使用.isin(...) 来获得更清洁的条件。 IE。 df.A.isin([1, 2]) & df.B.isin([600, 200])
    • 两种方法都能完美运行,而且非常简单。非常感谢,这对我很有帮助!
    【解决方案2】:

    您不能在第一行中包含它,因为第一行中 B 的值是 100 而不是 200。根据您的要求,代码可以采用以下方式:

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

    isin() 在多种情况下非常有用。

    【讨论】:

    • 最好将所有“代码”或换句话说,“非英文文本”放在代码块中。这增加了清晰度。
    猜你喜欢
    • 2022-10-19
    • 2017-11-18
    • 1970-01-01
    • 2021-09-27
    • 2019-06-28
    • 1970-01-01
    • 2016-09-03
    • 2020-11-16
    • 2015-07-12
    相关资源
    最近更新 更多