代码之家  ›  专栏  ›  技术社区  ›  PabloG

如何在多列上同时按条件列表筛选数据帧行

  •  0
  • PabloG  · 技术社区  · 3 年前

    我有一个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)]
    

    过滤时在哪里 A B 有两个值中的任何一个 过滤器打开 ,我应该得到以下数据帧:

       A  B     C
    1  Y  2   200
    2  Y  2   234
    4  Z  4  4243
    
    3 回复  |  直到 3 年前
        1
  •  3
  •   BENY    3 年前

    尝试 isin 转换为后 tuple

    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
    
        2
  •  3
  •   Dani Mesejo    3 年前

    你可以建立一个 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
  •  0
  •   Caner Burc BASKAYA    3 年前
    data.iloc[[i for  i,(a,b) in enumerate(zip(data.A, data.B)) if (a,b) in filter_on]]
    
        4
  •  0
  •   cs95    3 年前

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

    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