【问题标题】:Pandas Dataframes.to_csv truncates long valuesPandas Dataframes.to_csv 截断长值
【发布时间】:2019-04-18 09:06:50
【问题描述】:

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

e+12

[value1 value2 value3 。 . . value1853 value1854]

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

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 个值(1234567891230 到 1234567892230)的存储值如下所示

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的数据。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案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】:

      尝试将 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]"
      

      【讨论】:

        【解决方案3】:

        所以,在我的机器上复制您的代码,我看到了舍入,但没有看到列表的截断。

        我不知道最好的解决方案,但这里有一些建议

        您需要驱动器上的文件以供人类阅读吗? 以后用什么系统读取呢?

        • 如果文件将进入另一个 python 步骤,请考虑改用 pickle
        • 考虑将列表转换为字符串,您可以完全控制字符串(例如,每个值的显式小数位数)。如果您在内部保持列表结构完整,但只需将其包装在 "" 中,您几乎可以使用任何工具轻松解压它

        【讨论】:

          猜你喜欢
          • 2016-06-22
          • 1970-01-01
          • 2021-12-22
          • 1970-01-01
          • 2013-01-15
          • 2016-07-17
          • 1970-01-01
          • 1970-01-01
          • 2021-08-30
          相关资源
          最近更新 更多