Python 熊猫如何在所有浮点列都为NaN时删除行
我有以下几点Python 熊猫如何在所有浮点列都为NaN时删除行,python,pandas,dataframe,Python,Pandas,Dataframe,我有以下几点 AAA BBB CCC DDD ID1 ID2 ID3 ID4 0文本10 NaN 12 NaN 1 txt 10 NaN 12 13 2 txt txt txt NaN NaN NaN NaN 使用以下数据类型 AAA对象 BBB对象 CCC对象 DDD对象 ID1浮动64 ID2浮动64 ID3浮动64 ID4浮动64 是否只有在所有浮点列都为NaN时才有方法删除行 输出: AAA BBB CCC DDD ID1 ID2 ID3 ID4 0文本10 NaN 12 NaN 1
AAA BBB CCC DDD ID1 ID2 ID3 ID4
0文本10 NaN 12 NaN
1 txt 10 NaN 12 13
2 txt txt txt NaN NaN NaN NaN
使用以下数据类型
AAA对象
BBB对象
CCC对象
DDD对象
ID1浮动64
ID2浮动64
ID3浮动64
ID4浮动64
是否只有在所有浮点列都为NaN时才有方法删除行
输出:
AAA BBB CCC DDD ID1 ID2 ID3 ID4
0文本10 NaN 12 NaN
1 txt 10 NaN 12 13
我不能使用df.dropna(子集=['ID1'、'ID2'、'ID3'、'ID4']),因为我的真实df有几个动态浮动列
感谢使用get all float columns(获取所有浮点列),然后测试是否有非缺失值,并选择by(按)每行至少有一个非missing值-因此missing float行将被删除:
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
对于pass float列和参数how='all'
应更改您的解决方案,以测试每行的allNaN
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)
如果可能,多种类型的浮动通过np进行检查。浮动
:
df1 = df.dropna(subset=df.select_dtypes(np.floating).columns, how='all')
使用
我建议使用
include=np.number
,因为它包含所有float
dtype,这些类型可能都包含NaN
。使用include=float
时,您只需获得标准的npfloat64
dtype
举例说明:
df['ID5'] = np.array([1,2,np.nan], dtype=np.float16)
>>> df.select_dtypes(include=float).columns.tolist()
['ID1', 'ID2', 'ID3', 'ID4']
>>> df.select_dtypes(include=np.number).columns.tolist()
['ID1', 'ID2', 'ID3', 'ID4', 'ID5']
您可以将
NaN
替换为0
,然后删除仅包含NaN
df.loc[:,~df.replace(0,np.nan).isna().all()]
使用
isna
。您无法使用当前df执行此操作,因为您没有使用inplace=True
这是一个有缺陷的答案,因为它假设只有64个数据类型。检查我的编辑;p@rafaelc-hmmm,如果使用df['ID5']=np.array([1,2,np.nan])
我的代码工作正常,但如果可能,多个float
类型需要print(df.select\u dtypes(include=np.floating).columns.tolist())
df['ID5'] = np.array([1,2,np.nan], dtype=np.float16)
>>> df.select_dtypes(include=float).columns.tolist()
['ID1', 'ID2', 'ID3', 'ID4']
>>> df.select_dtypes(include=np.number).columns.tolist()
['ID1', 'ID2', 'ID3', 'ID4', 'ID5']