除了一个特定的列,我想删除所有包含任何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
答案 0 :(得分:4)
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