Pandas中如何将<NA>转为NaN且保留其他值为整数?
Pandas实现整数与NaN共存的方法
核心结论
可以实现你要的整数与NaN共存的格式,但需要结合Pandas的类型特性选择合适的方法。
方法一:使用object类型存储(显示为NaN,值为整数)
直接将非NaN的浮点值转为整数,保留原有的np.nan,列类型变为object:
import pandas as pd import numpy as np # 构造示例数据 df = pd.DataFrame({'weights': [100.0, 100.0, 100.0, np.nan, np.nan, np.nan, 100.0]}) # 转换非NaN值为整数,保留NaN df['weights'] = df['weights'].map(lambda x: int(x) if pd.notna(x) else x)
转换后结果:
weights 0 100 1 100 2 100 3 NaN 4 NaN 5 NaN 6 100
- 优点:完全匹配你要的显示格式,非NaN值为整数类型,NaN保留原形式
- 缺点:object类型列的运算效率低于原生数值类型,且可能混入其他类型数据(需谨慎操作)
方法二:保留Int64类型,修改缺失值显示为NaN
Pandas的Int64(大写I)是专门为整数+缺失值设计的Nullable Integer类型,用pd.NA表示缺失值,仅打印时显示为<NA>。若只是显示问题,可修改Pandas全局设置让pd.NA显示为NaN:
import pandas as pd import numpy as np df = pd.DataFrame({'weights': [100.0, 100.0, 100.0, np.nan, np.nan, np.nan, 100.0]}) # 转换为Int64类型 df['weights'] = df['weights'].astype('Int64') # 修改缺失值显示为NaN pd.options.display.na_rep = 'NaN'
此时查看结果:
weights 0 100 1 100 2 100 3 NaN 4 NaN 5 NaN 6 100
- 优点:列类型是高效的Nullable Integer,运算性能好,不会出现类型混乱
- 缺点:底层存储的缺失值是
pd.NA而非np.nan,但两者在pd.isna()等缺失值判断逻辑中完全等价
为什么直接替换会变回浮点型?
np.nan本质是浮点类型,当你把pd.NA替换为np.nan时,Pandas会自动将整列类型提升为float64以容纳浮点类型的缺失值,导致原本的整数也转为浮点型。拆分合并操作同理,只要列中同时存在整数和np.nan,Pandas就会自动将列转为浮点类型。
内容的提问来源于stack exchange,提问作者cppnewbie
相关产品推荐
相关产品推荐

