【问题标题】:Truncation issue with 19 digit long integer19 位长整数的截断问题
【发布时间】:2020-01-17 11:39:36
【问题描述】:

DataFrame

我从网络服务下载了一个 CSV 文件。当我使用 pandas.read_csv 导入 csv 时,19 位长 ID 被截断为小数。然后我使用pd.options.display.float_format = '{:.6f}'.format 完整显示ID。但是,当我将 ID 与 Web 服务中的 ID 进行比较时,python 完全改变了最后 3 位数字,只保留了前 16 位数字。我下载的时候以为是csv文件的问题,但是当我用记事本打开它时,ID与Web服务中的ID相同。我尝试过类似的东西

df = pd.read_csv(filepath, dtype={'ID':str})

df = pd.read_csv(filepath, dtype={'ID':np.int})

但代码不起作用。

我附上了 DataFrame 的屏幕截图,以便更好地说明我的问题。有没有办法保持ID不变?谢谢。

【问题讨论】:

    标签: python pandas dataframe decimal truncation


    【解决方案1】:

    对我来说默认解决方案有效,但可能需要np.int64

    df = pd.read_csv(filepath, dtype={'ID':np.int64})
    

    如果可能有一些缺失值且 pandas 版本为 0.24+,请使用 Int64

    df = pd.read_csv(filepath, dtype={'ID':'Int64'})
    

    【讨论】:

    • 我得到 ValueError:无法安全地将传递的 int64 用户 dtype 转换为 float64 dtyped 数据。我认为这是因为某些单元格具有 NaN 值。
    • 我仍然得到相同的 ValueError。
    • @ShaunLim - 你的熊猫版本是0.24+ 吗?如果是,返回什么代码ValueError
    • - 我正在使用 Jupyter 笔记本。现在的错误是“ValueError: Integer column has NA values in column 11”(这是 ID 列)。我尝试按块导入大文件,并导入没有 NaN 值的前 N ​​行,ID 与 Web 服务的 ID 匹配。然后,我尝试从 Web 服务下载前 100,00 行完全相同的数据并编码为df.fillna( { 'ID':0 } ),并将其导入 Jupyter 笔记本,并且成功了!但问题是我从Databricks批量下载数据,所以df.fillna( { 'ID':0 } )不起作用,因为批量下载的代码不同
    • ... 或者有一种方法可以在我不知道的批量下载代码中输入df.fillna( { 'ID':0 } )。但无论如何,至少现在我知道导致这个问题的是 NA 值。你对如何解决它有任何想法吗?有没有办法同时导入文件和删除 NA?我发现当我导入文件时,如果块在 ID 列中不包含 NaN 值,则 ID 是可以的。当 ID 列包含 NaN 值时,所有 ID 值将更改为不同的数字(最后 3-4 位)。
    猜你喜欢
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 2010-09-14
    • 2013-12-13
    相关资源
    最近更新 更多