代码之家  ›  专栏  ›  技术社区  ›  Piyush S. Wanare

pandas删除所有列中包含“必需值”的所有行

  •  3
  • Piyush S. Wanare  · 技术社区  · 8 年前

    我有以下数据框

     A     B    C    D
    BUY   150   Q   2018
    SELL  63    Q   2018
    N      N    N    N
    
    V      v    v    v
    SELL  53    Q   2018
    

    我要删除包含所有列a v或n的所有行

    输出数据帧为:

        A     B     C    D
       BUY   150    Q   2018
       SELL  63     Q   2018
    
       SELL  53     Q   2018
    
    3 回复  |  直到 8 年前
        1
  •  5
  •   jezrael    8 年前

    使用 boolean indexing :

    df = df[~df.isin(['V', 'v', 'N', 'n']).all(axis=1)]
    print (df)
          A    B  C     D
    0   BUY  150  Q  2018
    1  SELL   63  Q  2018
    4  SELL   53  Q  2018
    

    细节 :

    第一个比较者 isin :

    print (df.isin(['V', 'v', 'N', 'n']))
           A      B      C      D
    0  False  False  False  False
    1  False  False  False  False
    2   True   True   True   True
    3   True   True   True   True
    4  False  False  False  False
    

    获取行 all True 每行S:

    print (df.isin(['V', 'v', 'N', 'n']).all(axis=1))
    0    False
    1    False
    2     True
    3     True
    4    False
    dtype: bool
    

    反转条件 ~ :

    print (~df.isin(['V', 'v', 'N', 'n']).all(axis=1))
    0     True
    1     True
    2    False
    3    False
    4     True
    dtype: bool
    
        2
  •  2
  •   jpp    8 年前

    使用 pd.DataFrame.apply 具有 set 要创建布尔掩码,请执行以下操作:

    res = df[~(df.apply(set, axis=1) <= set('NnVv'))]
    
    print(res)
    
          A    B  C     D
    0   BUY  150  Q  2018
    1  SELL   63  Q  2018
    4  SELL   53  Q  2018
    

    注释 <= 是 set.issubset .

    这对于大量的列来说是很好的扩展。使用@jezrael's pd.DataFrame.all solution 对于大量行。

        3
  •  1
  •   BENY    8 年前

    replace + dropna (通知) thresh 钥匙在这里吗)

    df.replace(dict(zip(list('NnVv'),[np.nan]*4))).dropna(thresh=1)
    Out[513]: 
          A    B  C     D
    0   BUY  150  Q  2018
    1  SELL   63  Q  2018
    4  SELL   53  Q  2018