Pandas float64转Object原因及all()删除全NaN行异常问题咨询
问题原因解答
1. 数据类型并没有真的发生转换
你看到的dtype: object是单行选取后的临时Series的类型,不是原DataFrame列的类型:
- 原
Uni. Su Profile、Min. Su两列的dtype始终是float64,从你打印的result.dtypes和子DataFrame的values输出(float类型的NaN)都可以验证 - 当你用
result.loc[7,['Uni. Su Profile','Min. Su']]选取单行多列数据时,返回的是一个Series,该Series中所有值都是NaN,pandas会自动将这个临时Series的兼容dtype设为object,属于单行选取的正常表现,不影响原数据的类型。
2. all()方法返回结果不符合预期的原因
pandas的all()方法默认开启skipna=True参数,会自动跳过NaN值再做判断:
- 对于全为NaN的行,跳过所有NaN后相当于判断空序列的
all()结果,而Python原生逻辑中空序列的all()返回值为True,这就是你看到第7行也返回True的原因,不属于异常。
正确删除全空行的方案
先对目标列做isna()空值判断,再按行校验是否全为空即可,示例代码如下:
# 筛选出Modeling为Undrained的行对应两列,判断是否全为NaN mask = result.loc[result['Modeling']=='Undrained', ['Uni. Su Profile','Min. Su']].isna().all(axis=1) # 过滤掉全为空的行,得到处理后的DataFrame result = result[~mask]
内容的提问来源于stack exchange,提问作者LorenzoPeve
相关产品推荐
相关产品推荐

