Pandas删除包含"所需值"的所有行。在所有专栏中

时间:2018-06-06 10:16:48

标签: python pandas dataframe

我有以下数据框

 A     B    C    D
BUY   150   Q   2018
SELL  63    Q   2018
N      N    N    N

V      v    v    v
SELL  53    Q   2018

我想删除包含所有列V或N

的所有行

输出数据框将是: -

    A     B     C    D
   BUY   150    Q   2018
   SELL  63     Q   2018

   SELL  53     Q   2018

3 个答案:

答案 0 :(得分:5)

使用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获取行:

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

答案 1 :(得分:2)

使用pd.DataFrame.applyset创建布尔掩码:

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的pd.DataFrame.all solution获取大量行。

答案 2 :(得分:1)

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