当我将 pandas 数据框保存为 csv 文件时,从 18 位长的列中截断 3 位
Posted
技术标签:
【中文标题】当我将 pandas 数据框保存为 csv 文件时,从 18 位长的列中截断 3 位【英文标题】:3 digits are truncated from an 18 digit long column when I save my pandas dataframe as a csv file 【发布时间】:2019-06-26 13:05:24 【问题描述】:我从一个由 JSON 文件填充的字典创建了一个数据框。我的数据框中的 "id" 列包含 18 位整数。当我使用 python 打印 id 时,该值等于 JSON 文件中的原始值,但是当我尝试将我的数据帧保存为 csv 文件时,id 列以科学计数法保存,并且 id 右侧的三位数字是转换为零。 如何防止 csv 文件中的 id 值转换为科学计数法?
例如,当我查看csv时,我得到1.01045E+17
for id,当我看到值时,我得到101044874404577000
,而真正的值是101044874404577281
这是我的代码:
with open(data_path, encoding="utf8") as input_file:
data = json.load(input_file)
df = pd.DataFrame.from_dict(data)
df.to_csv(output_path)
我尝试将列的格式由astype
更改为str
、object
和float64
,但这并没有帮助。
我也设置了to_csv
函数的float_format
参数来保存具有指定小数位数的浮点数。这也不起作用。
【问题讨论】:
听起来像是浮点转换。来自json
或pandas
。您应该检查您的 data
dict 以查看该值是否正确。如果是,那么您需要将数据类型传递给from_dict
。
您是否尝试将 json 列转换为 int?我不确定这是否能解决问题,但您似乎正在使用整数
您如何查看 csv 文件?在 vi 或记事本之类的文本编辑器中,或者在已知会严重处理 csv 文件的 Excel 之类的电子表格中?
不,正如我所说,我已经打印了 id 列的值并且它是正确的。 @QuangHoang
不要使用float64
,而是使用int
或np.int64
。
【参考方案1】:
问题不在于转换为 csv,而在于将其加载到电子表格中。众所周知,Excel 对 csv 文件的支持很差,不幸的是,LibreOffice calc 尽力模拟 Excel...
它看到一个数字并错误地将其转换为双精度值。
演示:
在python中:
>>> x = 101044874404577281
>>> data = ["id": x, "str": "foo"]
>>> fd = io.StringIO()
>>> json.dump(data, fd)
>>> fd.seek(0,0)
0
>>> df = pd.read_json(fd)
>>> print(df)
id str
0 101044874404577281 foo
好的,这里一切正常。我们继续:
>>> df.to_csv('foo.csv', index=False)
在哑文本编辑器中打开时,如果还可以的话, foo.csv:
id,str
101044874404577281,foo
让我们将其加载到电子表格中:
对 calc 感到羞耻,它把它变成了科学记数法!让我们使用正常显示:
唉...它已经破坏了最后的数字...
TL/DR:这在 Python 和 pandas 中都不是问题,甚至在 csv 文件中都不是问题,但只有在 Excel 中。
【讨论】:
以上是关于当我将 pandas 数据框保存为 csv 文件时,从 18 位长的列中截断 3 位的主要内容,如果未能解决你的问题,请参考以下文章
将 pandas 数据框保存到 csv 时,如何保留 columns.name?