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

Ame*_*ina 15 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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

Rob*_*lak 16

重温mbatchkarov的链接,low_memory不会被弃用.它现在记录在案:

low_memory:布尔值,默认为True

以块的形式内部处理文件,导致在解析时使用较少的内存,但可能是混合类型推断.要确保没有混合类型,请设置False,或使用dtype 参数指定类型.请注意,整个文件都被读入单个DataFrame中,使用chunksizeiterator参数以块的形式返回数据.(仅对C解析器有效)

我问过什么导致混合型推理的意思,而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
Run Code Online (Sandbox Code Playgroud)

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

这种类型总是可以在事后恢复吗?(在收到警告后)?

我想重新导出到csv并重新阅读low_memory=False应该做的工作.

low_memory = False究竟如何修复问题?

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


mba*_*rov 7

low_memory显然有点被弃用,所以我不打扰它.

警告意味着列中的某些值具有一个dtype(例如str),并且一些具有不同的dtype(例如float).我相信熊猫使用最低常见的超级类型,在我使用的例子中object.

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

  • 正如@Robert Pollak 所回答的那样,low_memory 并未被弃用。 (3认同)