Pandas读取JSON时带引号字符串被转为小数的解决方法问询
问题解决:NPI字段转字符串出现.0后缀的处理方案
问题背景
JSON文件中npi_109字段为字符串类型(示例值:"1234567891"),使用Pandas读取后该字段被识别为decimal类型,转为字符串时出现"1234567891.0"的无效格式,需要修正为纯数字字符串。
JSON示例:
[{ ... "npi_109":"1234567891", ... }, { ...more records }]
读取代码:
import pandas as pd df = pd.read_json("temp/" + file.orig_filename, encoding = 'unicode_escape')
尝试转换的无效代码:
df['npi_109'] = df['npi_109'].astype(str)
可行解决方法
方法1:读取阶段直接指定字段类型(推荐)
在read_json时明确指定npi_109为字符串类型,从源头避免类型识别错误:
import pandas as pd # 定义字段类型映射 dtype_config = {'npi_109': str} df = pd.read_json("temp/" + file.orig_filename, encoding='unicode_escape', dtype=dtype_config)
此方法读取后字段直接为字符串,写入Parquet时会保留正确格式,无需后续转换。
方法2:已读取为数值类型后的转换
如果已经完成读取,可先将数值转为整数(NPI为整数,无小数部分)再转字符串:
# 处理非空值,转为整数后转字符串 df['npi_109'] = df['npi_109'].apply(lambda x: str(int(x)) if pd.notnull(x) else x) # 若存在空值需保留,也可使用fillna临时填充后转换(根据业务需求调整) df['npi_109'] = df['npi_109'].fillna(0).astype(int).astype(str).replace('0', pd.NA)
方法3:字符串格式化去除小数部分
通过格式化字符串直接截断小数部分,适合确保数值无小数的场景:
df['npi_109'] = df['npi_109'].apply(lambda x: "{:.0f}".format(x) if pd.notnull(x) else x)
内容的提问来源于stack exchange,提问作者Brian Edwards
相关产品推荐
相关产品推荐

