读取csv文件时的混合类型。原因,修复和后果

时间:2014-08-25 14:53:10

标签: python csv 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究竟如何解决问题?

2 个答案:

答案 0 :(得分:14)

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

  

low_memory 布尔值,默认为True

     

以块的形式内部处理文件,导致内存使用量降低   解析,但可能是混合类型推断。确保没有   混合类型设置为False,或使用 dtype 指定类型   参数。请注意,整个文件将读入单个DataFrame   无论如何,使用 chunksize iterator 参数返回数据   大块(仅对C解析器有效)

I have asked什么导致混合类型推断意味着,并且chris-b1回答:

  

这是确定性的 - 根据具体情况一致推断出类型   在数据中。也就是说,内部chunksize不是固定的数字   行,而是字节,所以你是否可以混合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究竟如何解决问题?

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

答案 1 :(得分:7)

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

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

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