Pandas读取JSON文件时含空值布尔列被识别为float类型相关问题
问题1:为什么col3被识别为float类型,col1却为object类型
- 核心原因是
numpy原生数据类型的限制:pandas早期依赖numpy的数据结构,原生bool类型不支持存储空值,原生int类型也不支持空值。 - 对于col3列:有效值为布尔类型,同时存在null值。pandas读取时会先将布尔值向上转型为整数(
True转为1,False转为0),再因为存在空值,继续向上转型为支持空值的float64类型,空值会被替换为NaN。 - 对于col1列:有效值为字符串类型,空值为
None,二者都属于Python对象范畴,pandas的object类型可以直接容纳任意Python对象,不需要做类型升级,所以直接识别为object类型。
问题2:无需显式强转的通用解决方案
pandas 1.0及以上版本推出了原生可空数据类型,可通过convert_dtypes()方法自动推断并转换为符合原始语义的类型,不需要单独指定某一列的类型,示例代码如下:
import pandas as pd source_path = 's3://bucket/prefix/file.json' df = pd.read_json(source_path, lines=True) # 自动转换为适配的可空类型 df = df.convert_dtypes()
转换后col3的类型会变为boolean(pandas可空布尔类型),取值为True、<NA>、True,完全匹配原始JSON的语义,同时col1会自动转换为更规范的string可空字符串类型,id列会转换为Int64可空整数类型。
内容的提问来源于stack exchange,提问作者jarretg
相关产品推荐
相关产品推荐

