【问题标题】:Mixed types when reading csv files. Causes, fixes and consequences读取 csv 文件时的混合类型。原因、解决方法和后果
【发布时间】:2014-10-18 18:24:10
【问题描述】:

当 Pandas 发出此警告时,究竟会发生什么?我应该担心吗?

In [1]: read_csv(path_to_my_file)
/Users/josh/anaconda/envs/py3k/lib/python3.3/site-packages/pandas/io/parsers.py:1139: 
DtypeWarning: Columns (4,13,29,51,56,57,58,63,87,96) have mixed types. Specify dtype option on import or set low_memory=False.              

  data = self._reader.read(nrows)

我认为这意味着 Pandas 无法从这些列上的值推断类型。但如果是这种情况,Pandas 最终会为这些列使用什么类型

另外,类型总是可以在事后恢复吗? (收到警告后),或者是否存在我可能无法正确恢复原始信息的情况,我应该预先指定类型?

最后,low_memory=False 究竟是如何解决问题的?

【问题讨论】:

    标签: python csv pandas


    【解决方案1】:

    重新访问 mbatchkarov 的链接,low_memorynot deprecated。 是now documented:

    low_memory布尔值,默认为 True

    在内部以块的形式处理文件,从而减少内存使用,同时 解析,但可能是混合类型推断。为确保不 混合类型要么设置为 False,要么使用 dtype 指定类型 范围。请注意,整个文件被读入单个 DataFrame 无论如何,使用 chunksizeiterator 参数返回数据 成块。 (仅对 C 解析器有效)

    I have asked导致混合类型推断是什么意思,chris-b1 回答:

    它是确定性的 - 类型始终根据什么来推断 在数据中。也就是说,内部块大小不是固定数字 行数,而不是字节数,所以是否可以混合 dtype 警告 或不可以感觉有点随机。

    那么,Pandas 最终会为这些列使用什么类型?

    以下独立示例回答了这个问题:

    df=pd.read_csv(StringIO('\n'.join([str(x) for x in range(1000000)] + ['a string'])))
    DtypeWarning: Columns (0) have mixed types. Specify dtype option on import or set low_memory=False.
    
    type(df.loc[524287,'0'])
    Out[50]: int
    
    type(df.loc[524288,'0'])
    Out[51]: str
    

    csv数据的第一部分被视为只有int,所以转换为int, 第二部分也有一个字符串,所以所有条目都保存为字符串。

    类型在事后总能恢复吗? (收到警告后)?

    我想重新导出到 csv 并使用 low_memory=False 重新读取应该可以完成这项工作。

    low_memory=False 究竟如何解决问题?

    它在决定类型之前读取所有文件,因此需要更多内存。

    【讨论】:

    • 我第一次收到 DType 警告,在我使用 low_memory=False 后它消失了。但是,有这个错误Error: C stack usage 528430048 is too close to the limit Error: C stack usage 528429312 is too close to the limit。这甚至在 low_memory=False 标志之前就已经存在。有什么解决办法吗?我更改了here 中提到的 R 版本,它只工作了一次,但我现在一直收到错误。
    【解决方案2】:

    low_memory 显然是kind of deprecated,所以我不会打扰它。

    警告意味着列中的某些值具有一种 dtype(例如 str),而某些值具有不同的 dtype(例如 float)。我相信 pandas 使用最低的通用超类型,在我使用的示例中是object

    您应该检查您的数据,或在此处发布一些数据。特别是,查找缺失值或格式不一致的 int/float 值。如果您确定您的数据是正确的,那么使用dtypes 参数帮助pandas 输出。

    【讨论】:

    • low_memory 未被弃用,正如@Robert Pollak 回答的那样。
    猜你喜欢
    • 2012-09-06
    • 1970-01-01
    • 2023-04-09
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多