python read csv dtype_python – Pandas read_csv low_memory和dtype选项

已弃用的low_memory选项

low_memory选项没有被正确地弃用,但它应该是,因为它实际上不做任何不同的事情[source]

你得到这个low_memory警告的原因是因为猜测每列的dtypes是非常内存要求。 Pandas尝试通过分析每列中的数据来确定要设置的dtype。

Dtype猜测(非常糟糕)

Pandas只能确定读取整个文件时列应该具有的dtype。这意味着在读取整个文件之前不能真正解析任何内容,除非您在读取最后一个值时有必要更改该列的dtype。

考虑具有称为user_id的列的一个文件的示例。

它包含1000万行,其中user_id始终是数字。

因为熊猫不知道它只是数字,它可能会保持它作为原始字符串,直到它读取整个文件。

指定dtypes(应始终执行)

添加

dtype={'user_id': int}

到pd.read_csv()调用将使熊猫知道什么时候开始读取文件,这只是整数。

还值得注意的是,如果文件中的最后一行将在“user_id”列中写入“foobar”,如果指定了上述dtype,加载将会崩溃。

定义dtypes时中断的损坏数据示例

import pandas as pd

from StringIO import StringIO

csvdata = """user_id,username

1,Alice

3,Bob

foobar,Caesar"""

sio = StringIO(csvdata)

pd.read_csv(sio, dtype={"user_id": int, "username": object})

ValueError: invalid literal for long() with base 10: 'foobar'

蠢,警告,注释

设置dtype = object将会使上面的警告静音,但不会使它更有效的内存,只有处理高效的任何东西。

设置dtype = unicode不会做任何事情,因为numpy,一个unicode表示为对象。

转换器的使用

@sparrow正确指出转换器的使用,以避免熊猫在指定为int的列中遇到“foobar”时冒出来。我想补充一点,转换器在大熊猫中使用非常繁重和低效,应该作为最后的手段。这是因为read_csv进程是单个进程。

CSV文件可以逐行处理,因此可以通过简单地将文件分割成段并运行多个进程,熊猫不支持的并行处理更高效地并行处理多个转换器。但这是一个不同的故事。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值