pandas版本1.4.4
pandas对于缺失值的处理在官方文档中有详细的说明。其把None和NaN都当做缺失值,即所有的关于缺失值的判断、处理和填充等函数都是兼容None的。额外要注意的是,None在python语言本身是可以用==判断的,但是在pandas中,其把None当作和NaN一样,都不能用==判断,比如不能用df == None来矢量化对于判断缺失值,因此需要通过特定的函数isna, isnull, notna, notnull这些函数来判断。
当把一个带有缺失值的df写入到parquet文件,parquet的缺失值的处理是和python兼容的,会一律把缺失值转为None,无论原始的df中的缺失值是None还是NaN。由于pandas本身在将数据转为df时,会额外对缺失值进行处理,处理原则是,如果某列的类型推断为object,那么缺失值会保留原来的值,即None或NaN,但是如果带有缺失值的列推断为数值类型,那么缺失值会全部被转为浮点数类型的NaN,这时原来的None缺失值也会被转为NaN。
因此,这里的过程是:df写入parquet文件,缺失值会被保存;当读取parquet时,缺失值会被parquet解析为python的None,但是pandas自身对缺失值做进一步处理:如果带有缺失值的列是object类型,那么缺失值为None,如果是数值类型,缺失值为NaN。
大多数情况下,由于pandas对None和NaN的处理方式一致,不会有什么影响,但是少数情况下,为了统一,提供以下解决方式:
1. 可以在读取parquet文件时,指定use_nullable_dtypes=True,这样会把缺失值都转为统一的pd.NA,这个是pandas自身的缺失值,既不是NaN也不是None,但是缺失值函数也都兼容。
2. 读取后,可以通过df[df.isnull()] = np.nan的方式来将所有缺失值都转为NaN;或者使用df.replace({None:np.nan})方式替换。