当熊猫发出此警告时究竟会发生什么?我应该担心吗?
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
究竟如何解决问题?
答案 0 :(得分:14)
重新访问mbatchkarov的链接,low_memory
为not 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
。