Pandas Dataframes.to_csv会截断长值

时间:2018-11-15 09:42:08

标签: python pandas dataframe

问题::我正在尝试使用python中的Pandas数据框存储大型数据集。我的麻烦是,当我尝试将其保存到csv时,我的数据块将被截断,例如:

  

e + 12

     

     

[值1值2值3 。 。 。 value1853 value1854]

说明: 我需要将大量数据存储到单个单元格中,并且需要存储的某些值是Long(时间)值,并且我创建了一个简短的脚本来显示我遇到的错误:

dframe = pd.DataFrame()
arr = np.array([])
for x in range(1234567891230,1234567892230):
    arr = np.append(arr,x)
dframe['elements'] = [arr]
print(dframe['elements'][0][999])   # prints correct values, eg. 1234567892229.0
dframe.to_csv('temp.csv', index=False)

在上面的示例中,对于前1000个值(123456789 1230 至123456789 2230 ),存储的值显示为如下

  

1.23456789e + 12

完全忽略了四个最低有效字符。如果将列表扩展到1001个值,甚至更多的内容将被截断:

dframe = pd.DataFrame()
arr = np.array([])
for x in range(1234567891230,1234567892231):
    arr = np.append(arr,x)
dframe['elements'] = [arr]
print(dframe['elements'][0][999])   # still prints correct values, eg. 1234567892229.0
dframe.to_csv('temp.csv', index=False)

完整的csv文件最终如下所示:

  

元素

     

“ [1.23456789e + 12 1.23456789e + 12 1.23456789e + 12 ... 1.23456789e + 12    1.23456789e + 12 1.23456789e + 12]“

几乎删除了全部1000个元素,并用 ... 替换了它们。

有人知道这些问题的解决方法或解决方法吗?

这不仅仅是为了显示而被截断的问题(例如Pandas to_html() truncates string contents),而是实际上破坏了存储到csv的数据。

3 个答案:

答案 0 :(得分:1)

尝试将numpy数组的dtype设置为整数。

dframe = pd.DataFrame()
arr = np.array([], dtype='int16')
for x in range(1234567891230,1234567892230):
    arr = np.append(arr,x)
dframe['elements'] = [arr]
print(dframe['elements'][0][999])   # prints correct values, eg. 1234567892229.0
dframe.to_csv('temp.csv', index=False)

元素

"[1234567891230 1234567891231 1234567891232 ... 1234567891233 1234567891234]"

答案 1 :(得分:1)

将数据类型更改为@Jacob Tomlinson所说的解决了一个问题,研究numpys array2string解决了另一个问题。

添加np.set_printoptions(threshold=np.nan)可阻止to_csv截断输出字符串。

dframe = pd.DataFrame()
arr = np.array([])
for x in range(1234567891230,1234567892230):
    arr = np.append(arr,x)
dframe['elements'] = [arr.astype('uint64')]
print(dframe['elements'][0][999])   # prints correct values, eg. 1234567892229.0

np.set_printoptions(threshold=np.nan)
dframe.to_csv('temp.csv', index=False)

答案 2 :(得分:0)

因此,将代码复制到我的机器上,我看到的是四舍五入,但列表没有被截断。

我不知道最佳的解决方案,但这是一些建议

您是否需要人类可读的驱动器上的文件? 以后会用什么系统读取?

  • 如果文件只是进入另一个python步骤,请考虑使用pickle代替
  • 考虑将您的列表转换为字符串,您可以完全控制该字符串(例如,每个值的小数位数都应明确显示)。如果您在内部保留列表结构完整,但只需将其包装在""中,则可以使用那里的任何工具轻松地将其拆包