pandas 当所有浮点列均为 NaN 时如何删除行

Mat*_*teo 2 python dataframe pandas

我有以下 df

  AAA BBB CCC DDD  ID1  ID2  ID3  ID4
0 txt txt txt txt  10   NaN  12   NaN
1 txt txt txt txt  10   NaN  12   13
2 txt txt txt txt  NaN  NaN  NaN  NaN
Run Code Online (Sandbox Code Playgroud)

具有以下 dtypes

AAA          object
BBB          object
CCC          object
DDD          object
ID1          float64
ID2          float64
ID3          float64
ID4          float64
Run Code Online (Sandbox Code Playgroud)

有没有办法仅当所有浮点列均为 NaN 时才删除行?

输出:

  AAA BBB CCC DDD  ID1  ID2  ID3  ID4
0 txt txt txt txt  10   NaN  12   NaN
1 txt txt txt txt  10   NaN  12   13
Run Code Online (Sandbox Code Playgroud)

我无法使用 df.dropna(subset=['ID1','ID2','ID3','ID4']) 做到这一点,因为我真正的 df 有几个动态浮动列。

谢谢

jez*_*ael 5

使用DataFrame.select_dtypesfor 获取所有浮点列,然后测试非缺失值并选择DataFrame.any每行至少一个非缺失值 - 因此删除缺失的浮点行:

df1 = df[df.select_dtypes(float).notna().any(axis=1)]
print (df1)
   AAA  BBB  CCC  DDD   ID1  ID2   ID3   ID4
0  txt  txt  txt  txt  10.0  NaN  12.0   NaN
1  txt  txt  txt  txt  10.0  NaN  12.0  13.0
Run Code Online (Sandbox Code Playgroud)

您的解决方案DataFrame.dropna应该更改为传递浮动列和how='all'测试参数(如果每NaN行都为 s):

df1 = df.dropna(subset=df.select_dtypes(float).columns, how='all')
#for return same dataframe 
#df.dropna(subset=df.select_dtypes(float).columns, how='all', inplace=True)
Run Code Online (Sandbox Code Playgroud)

如果可能的话,通过以下方式检查多种类型的浮点数np.floating

df1 = df.dropna(subset=df.select_dtypes(np.floating).columns, how='all')
Run Code Online (Sandbox Code Playgroud)