Pandas:从DataFrame中删除带有nans,0和NA的所有列

时间:2014-12-03 13:51:19

标签: python pandas dataframe nan

我有一个如下所示的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'],})

如何删除列中的所有NANans0,以便获得以下输出?

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)]但它无法正常工作。

2 个答案:

答案 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