Pandas:保存再加载后user_pseudo_id值变更问题及解决方法
问题描述
我有一个DataFrame,其中包含user_pseudo_id列,数据如下:
user_pseudo_id 2041513012.1676969234 2041513191.1677359234 2041513765.1677359510
该列数据类型为字符串。但使用以下代码保存并重新加载后:
df.to_csv(path_to_data, index=False) df = pd.read_csv(path_to_data)
该列的值发生了变化,变为:
user_pseudo_id 2041513012.1676967 2041513191.1677360 2041513765.1677360
问题原因
核心问题是pandas读取CSV时的自动类型推断:
- CSV文件本身不携带数据类型信息,
pd.read_csv()会自动识别列的类型。你的user_pseudo_id列内容格式类似浮点数,被推断成了float64类型。 float64的精度有限,最多只能精确表示15-17位有效数字,而你的原始字符串小数部分有10位,加上整数部分的10位,总有效数字超出了float64的精确范围,导致存储时出现精度丢失,加载后的值自然发生变化。
解决方法
有两种可靠的解决方式:
1. 读取CSV时强制指定列类型为字符串
在pd.read_csv()中通过dtype参数指定user_pseudo_id列的类型为字符串,避免自动推断:
df = pd.read_csv(path_to_data, dtype={"user_pseudo_id": str})
2. 使用带类型信息的格式保存数据
如果需要长期保留数据类型信息,建议用Parquet、Feather这类支持类型存储的格式替代CSV:
# 保存为Parquet df.to_parquet(path_to_data, index=False) # 加载 df = pd.read_parquet(path_to_data)
这种方式不需要额外指定类型,能完整保留原始的字符串数据。
内容的提问来源于stack exchange,提问作者Petr Petrov
相关产品推荐
相关产品推荐

