如何将DataFrame指定列中小数位数超1位的数值替换为nan并转整型
解决方案
前置依赖
首先导入需要的依赖库:
import pandas as pd import numpy as np
步骤1:清理无效浮点数值
假设待处理的DataFrame名为df,要处理的目标列名为target_col,执行以下代码完成过滤:
df['target_col'] = df['target_col'].where( (df['target_col'] > 0) & (df['target_col'] % 1 == 0), other=np.nan )
逻辑说明
df['target_col'] > 0筛选所有正数值,自动排除负数df['target_col'] % 1 == 0筛选小数部分为0的数值,也就是以.0结尾的有效数值,自动过滤存在其他小数位的垃圾值- 不符合两个条件的数值会被统一替换为
np.nan - 如果你的数据存在浮点精度误差(比如实际应为100.0的数值被存储为100.0000000001),可以将第二个判断条件替换为
np.isclose(df['target_col'] % 1, 0),避免误判。
步骤2:转换为整型
由于Python原生int类型不支持空值,这里使用pandas提供的可空整型Int64(首字母大写)完成类型转换:
df['target_col'] = df['target_col'].astype('Int64')
转换后列中有效数据为整型,空值为pandas兼容的pd.NA,不会出现类型报错。
测试验证
你可以用以下代码验证效果,输入就是你给出的示例数据:
test_data = [129.0, np.nan, 100.0, 87.0, 40.0, 344.992, 130.0, 101.0, 227.0, 147.0, 190.0, 83.0, -144.63542183979368] df = pd.DataFrame({'target_col': test_data}) # 执行清理 df['target_col'] = df['target_col'].where((df['target_col'] > 0) & (df['target_col'] % 1 == 0), np.nan) # 转换类型 df['target_col'] = df['target_col'].astype('Int64') print(df['target_col'])
输出结果和你预期的完全一致。
内容的提问来源于stack exchange,提问作者Gaurav D Verma
相关产品推荐
相关产品推荐

