我有一个如下所示的DataFrame:
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': [1, 2.1, np.nan, 4.7, 5.6, 6.8],
'B': [0, np.nan, np.nan, 0, 0, 0],
'C': [0, 0, 0, 0, 0, 0.0],
'D': [5, 5, 5, 5, 5.6, 6.8],
'E': ['NA', 'NA', 'NA', 'NA', 'NA', 'NA'],})
如何删除列中的所有NA
,Nans
和0
,以便获得以下输出?
df2 = pd.DataFrame({'A': [1, 2.1, np.nan, 4.7, 5.6, 6.8],
'D': [5, 5, 5, 5, 5.6, 6.8],})
到目前为止,我知道.dropna()
将删除所有nan
我也尝试过df2=df[~(df==0).all(axis=1)]
但它无法正常工作。
答案 0 :(得分:1)
您可以尝试使用df.isin()
和all()
查找不包含空值的列数组,然后使用此数组选择df
的相关列:< / p>
>>> df[df.columns[(~df.isin([NaN, 'NA', 0])).all().values]]
A D
0 1.0 5.0
1 2.1 5.0
2 NaN 5.0
3 4.7 5.0
4 5.6 5.6
5 6.8 6.8
或者更简洁:df.loc[:, (~df.isin([NaN, 'NA', 0])).all()]
答案 1 :(得分:1)
>>> df
A B C D E
0 1.0 0 0 5.0 NA
1 2.1 NaN 0 5.0 NA
2 NaN NaN 0 5.0 NA
3 4.7 0 0 5.0 NA
4 5.6 0 0 5.6 NA
5 6.8 0 0 6.8 NA
>>> f = df.replace([0,'NA'], np.nan).apply(lambda x: any(~x.isnull()))
>>> f
A True
B False
C False
D True
E False
dtype: bool
>>> df.loc[:,f]
A D
0 1.0 5.0
1 2.1 5.0
2 NaN 5.0
3 4.7 5.0
4 5.6 5.6
5 6.8 6.8