当我将 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 更改为strobjectfloat64,但这并没有帮助。 我也设置了to_csv 函数的float_format 参数来保存具有指定小数位数的浮点数。这也不起作用。

【问题讨论】:

听起来像是浮点转换。来自jsonpandas。您应该检查您的 data dict 以查看该值是否正确。如果是,那么您需要将数据类型传递给from_dict 您是否尝试将 json 列转换为 int?我不确定这是否能解决问题,但您似乎正在使用整数 您如何查看 csv 文件?在 vi 或记事本之类的文本编辑器中,或者在已知会严重处理 csv 文件的 Excel 之类的电子表格中? 不,正如我所说,我已经打印了 id 列的值并且它是正确的。 @QuangHoang 不要使用float64,而是使用intnp.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 位的主要内容,如果未能解决你的问题,请参考以下文章

将熊猫数据框保存到csv时如何保留numpy数组

将 pandas 数据框保存到 csv 时,如何保留 columns.name?

将 pandas 数据框保存到 csv 时,如何保留 columns.name?

Pandas to_csv() 检查覆盖

在 Pandas 中保存 csv 文件时如何添加交替的空行

将包含长列表的 Pandas df 保存为 csv 文件