Pandas read_json读取大整数时错误转换为字符串问题
Pandas read_json解析大整数tid时出现类型不一致的问题解决
你遇到的这个问题其实是Pandas在自动类型推断时的常见行为——当JSON里的字符串形式整数在int64的安全范围内时,会被自动转成整数类型;但超过这个范围的大整数,就会被保留为字符串,避免精度丢失。
问题原因
先看你的JSON内容:所有tid的值都是用双引号包裹的字符串,但Pandas的read_json会尝试对这些字符串做类型推断:
- 像
"9999999999999998"(16位)这类数值在int64的范围内(-9223372036854775808 ~ 9223372036854775807),所以会被自动转为整数; - 而
"10000000000000001"(17位)超过了int64的最大值,Pandas为了避免强制转换导致的精度丢失,就会保留它的字符串类型。
解决方案
下面提供两种直接的解决方法:
方法1:强制指定tid列为字符串类型
通过dtype参数明确指定列类型,让所有tid都保持字符串格式,避免混合类型:
import pandas as pd json_content=""" { "1": { "tid": "9999999999999998", }, "2": { "tid": "9999999999999999", }, "3": { "tid": "10000000000000001", }, "4": { "tid": "10000000000000002", } } """ df = pd.read_json( json_content, orient='index', convert_axes=False, dtype={'tid': str} # 强制tid列为字符串 ) print(df.info()) print(df['tid'])
方法2:先解析JSON再转为DataFrame(保留大整数)
如果需要把tid作为Python原生大整数存储(而非numpy的int64),可以先用Python标准库解析JSON,手动转换类型后再转成DataFrame:
import pandas as pd import json json_content=""" { "1": { "tid": "9999999999999998", }, "2": { "tid": "9999999999999999", }, "3": { "tid": "10000000000000001", }, "4": { "tid": "10000000000000002", } } """ # 解析JSON并将tid转为整数 data = json.loads(json_content) for entry in data.values(): entry['tid'] = int(entry['tid']) # 转为DataFrame df = pd.DataFrame.from_dict(data, orient='index') print(df.info()) print(df['tid'])
这种方式下,tid列会是object类型,存储的是Python原生的int对象,可以处理任意大小的整数,不会有精度丢失问题。
内容的提问来源于stack exchange,提问作者Udayraj Deshmukh
相关产品推荐
相关产品推荐

