熊猫删除所有包含除一个之外的所有nan的列

时间:2018-07-23 23:30:41

标签: python pandas numpy

除了一个特定的列,我想删除所有包含任何nan的列。

df=pd.DataFrame([[1,2,np.nan,4],[1,2,4,5],[np.nan,6,np.nan,6],[4,np.nan,6,7],[1,2,3,4]], columns=['A','B','C','D'])

>>> df
     A    B    C  D
0  1.0  2.0  NaN  4
1  1.0  2.0  4.0  5
2  NaN  6.0  NaN  6
3  4.0  NaN  6.0  7
4  1.0  2.0  3.0  4

我喜欢删除除df ['C']之外的所有包含nan的内容。

>>> df
     C  D
0  NaN  4
1  4.0  5
2  NaN  6
3  6.0  7
4  3.0  4

5 个答案:

答案 0 :(得分:4)

IIUC,使用isna() + any()检查要删除的列

d = df.isna().any()

将要忽略的列设置为False

cols_to_ignore = ['C']
d[cols_to_ignore] = False

还有loc

df.loc[:, ~d]

    C   D
0   NaN 4
1   4.0 5
2   NaN 6
3   6.0 7
4   3.0 4

答案 1 :(得分:2)

使用来自熊猫subset的{​​{1}}参数的班轮。

dropna

df.dropna(subset=[n for n in df if n != 'column_to_keep'], inplace=True) 是您要保留nan的列。

答案 2 :(得分:1)

我也会使用isna().any(),但也会使用df.columns.difference(['columns_to_ignore'])

tmp = df[df.columns.difference(['C'])].isna().any()

df.drop(tmp.index[tmp], axis=1)

     C  D
0  NaN  4
1  4.0  5
2  NaN  6
3  6.0  7
4  3.0  4

说明

tmp是布尔值排除要忽略的列的数据框:

>>> tmp
A     True
B     True
D    False
dtype: bool

所以tmp.index[tmp]返回要删除的列的列表:

>>> tmp.index[tmp]
Index(['A', 'B'], dtype='object')

答案 3 :(得分:1)

您可以使用combine_first

df.dropna(1).combine_first(df[['C']])
Out[301]: 
     C  D
0  NaN  4
1  4.0  5
2  NaN  6
3  6.0  7
4  3.0  4

答案 4 :(得分:0)

您可以删除所有列,而不是保留列,然后再添加想要的列。

newdf = df.dropna(axis=1).copy() #.copy() is only here to suppress a warning.
newdf['C'] = df['C']
newdf
#produces this dataframe:
   D    C
0  4  NaN
1  5  4.0
2  6  NaN
3  7  6.0
4  4  3.0