【问题标题】:Pandas: Filtering multiple conditionsPandas:过滤多个条件
【发布时间】:2021-09-01 16:42:31
【问题描述】:

我正在尝试使用 Pandas 对几个条件进行布尔索引。我原来的 DataFrame 叫做df。如果我执行以下操作,我会得到预期的结果:

temp = df[df["bin"] == 3]
temp = temp[(~temp["Def"])]
temp = temp[temp["days since"] > 7]
temp.head()

但是,如果我这样做(我认为应该是等效的),我不会得到任何行返回:

temp2 = df[df["bin"] == 3]
temp2 = temp2[~temp2["Def"] & temp2["days since"] > 7]
temp2.head()

知道造成这种差异的原因是什么吗?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    使用(),因为operator precedence

    temp2 = df[~df["Def"] & (df["days since"] > 7) & (df["bin"] == 3)]
    

    或者,在单独的行上创建条件:

    cond1 = df["bin"] == 3    
    cond2 = df["days since"] > 7
    cond3 = ~df["Def"]
    
    temp2 = df[cond1 & cond2 & cond3]
    

    示例

    df = pd.DataFrame({'Def':[True] *2 + [False]*4,
                       'days since':[7,8,9,14,2,13],
                       'bin':[1,3,5,3,3,3]})
    
    print (df)
         Def  bin  days since
    0   True    1           7
    1   True    3           8
    2  False    5           9
    3  False    3          14
    4  False    3           2
    5  False    3          13
    
    
    temp2 = df[~df["Def"] & (df["days since"] > 7) & (df["bin"] == 3)]
    print (temp2)
         Def  bin  days since
    3  False    3          14
    5  False    3          13
    

    【讨论】:

    • 有了样本,这变得好多了!
    • 第一个条件没有括号?这似乎改变了我。
    • 如果你有一个 LARGE DataFrame,每个条件都会过滤 complete DataFrame。您可以通过链接过滤器来连续减少搜索空间吗?例如应用第一个,将第二个应用到 that 结果,...?
    • @wwii 如果数据框真的很大,那么您是对的。首先按删除最多行的条件过滤,分配给数据框。然后按第二个和类似的过滤...
    • @wwii 这里的意思是temp1 = df[df["bin"] == 3] temp2 = temp1[temp1["days since"] > 7] temp3 = temp2[~temp2["Def"]]
    【解决方案2】:

     df_train[(df_train["fold"]==1) | (df_train["fold"]==2)]
    

     df_train[(df_train["fold"]==1) & (df_train["fold"]==2)]
    

    【讨论】:

    • 虽然此代码可能会为问题提供解决方案,但最好添加有关其工作原理/方式的上下文。这可以帮助未来的用户学习并将这些知识应用到他们自己的代码中。在解释代码时,您也可能会以赞成票的形式从用户那里获得积极的反馈。
    【解决方案3】:

    如果你想要多个条件:

    Del_Det_5k_top_10 = Del_Det[(Del_Det['State'] == 'NSW') & (Del_Det['route'] == 2) |
                                (Del_Det['State'] == 'VIC') & (Del_Det['route'] == 3)]
    

    【讨论】:

      【解决方案4】:

      或者,你可以使用query的方法:

      df.query('not Def & (`days since` > 7) & (bin == 3)')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-09
        • 1970-01-01
        • 2017-03-07
        • 2021-11-04
        • 2020-08-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多