我有以下数据框
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
答案 0 :(得分:5)
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.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的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