【问题标题】:How to filter DataFrame rows by list of conditions simultaneously on multiple columns如何在多列上同时按条件列表过滤 DataFrame 行
【发布时间】:2021-04-03 17:13:36
【问题描述】:

我有一个 DataFrame,我想在其中过滤行,应用同时适用于两列的条件列表。例如:

pd.DataFrame({'A':['Y','Y','Y','Z','Z'],'B':[1,2,2,3,4],'C':[100,200,234,358,4243]})
   A  B     C
0  Y  1   100
1  Y  2   200
2  Y  2   234
3  Z  3   358
4  Z  4  4243
filter_on=[('Y',2),('Z',4)]

当过滤 ABfilter_on 有任何一对值时,我应该得到以下 DataFrame:

   A  B     C
1  Y  2   200
2  Y  2   234
4  Z  4  4243

【问题讨论】:

    标签: python pandas filter multiple-columns


    【解决方案1】:

    这个基于set_indexIndex.isin 的简洁解决方案怎么样?

    df[df.set_index(['A', 'B']).index.isin(filter_on)]
    
       A  B     C
    1  Y  2   200
    2  Y  2   234
    4  Z  4  4243
    

    【讨论】:

      【解决方案2】:

      您可以从列中构建一个MultiIndex 并使用isin 来计算掩码,如下所示:

      mask = pd.MultiIndex.from_arrays([df['A'], df['B']]).isin(filter_on)
      print(df[mask])
      

      输出

         A  B     C
      1  Y  2   200
      2  Y  2   234
      4  Z  4  4243
      

      【讨论】:

        【解决方案3】:

        在转换为tuple 后尝试使用isin

        out = df[df[['A','B']].apply(tuple,1).isin(filter_on)].copy()
           A  B     C
        1  Y  2   200
        2  Y  2   234
        4  Z  4  4243
        

        【讨论】:

          【解决方案4】:
          data.iloc[[i for  i,(a,b) in enumerate(zip(data.A, data.B)) if (a,b) in filter_on]]
          

          【讨论】:

            猜你喜欢
            • 2023-03-14
            • 2019-07-30
            • 2014-08-12
            • 1970-01-01
            • 1970-01-01
            • 2017-08-26
            • 2021-12-06
            • 1970-01-01
            • 2015-05-29
            相关资源
            最近更新 更多