当前位置: 首页 > 知识库问答 >
问题:

熊猫read_csv:low_memory和dtype选项

曹建华
2023-03-14
df = pd.read_csv('somefile.csv')

...给出一个错误:

.../site-packages/pandas/io/parsers . py:1130:dtype warning:列(4,5,7,16)具有混合类型。请在导入时指定dtype选项,或者设置low_memory=False。

为什么dtype选项与low_memory相关,为什么low_memory=False可能有帮助?

共有3个答案

赵刚豪
2023-03-14
df = pd.read_csv('somefile.csv', low_memory=False)

这应该可以解决问题。我从CSV读取1.8M行时得到了完全相同的错误。

东郭勇
2023-03-14

尝试:

dashboard_df = pd.read_csv(p_file, sep=',', error_bad_lines=False, index_col=False, dtype='unicode')

根据熊猫文件:

dtype:列的类型名称或dict-

至于low_memory,默认情况下是真的,还没有记录。但我认为这并不相关。错误消息是一般性的,因此无论如何都不需要处理low_memory。希望这能有所帮助,如果您还有其他问题,请告诉我

璩浩广
2023-03-14

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

您收到此low_memory警告的原因是猜测每列的dtype非常需要内存。熊猫试图通过分析每列中的数据来确定要设置的dtype。

Pandas只能在整个文件被读取后决定一个列应该具有什么样的数据类型。这意味着,在读取整个文件之前,实际上什么也解析不了,除非您冒着在读取最后一个值时必须更改该列的dtype的风险。

考虑一个文件的示例,该文件有一个名为user_id的列。它包含1000万行,其中user_id始终是数字。由于pandas无法知道它只是数字,它可能会将其作为原始字符串保留,直到它读取了整个文件。

dtype={'user_id': int}

to pd.read_csv() 调用将使 pandas 在开始读取文件时知道这只是整数。

同样值得注意的是,如果文件的最后一行将< code >“foobar”写入< code>user_id列,那么如果指定了上述dtype,加载将会崩溃。

import pandas as pd
try:
    from StringIO import StringIO
except ImportError:
    from io import StringIO


csvdata = """user_id,username
1,Alice
3,Bob
foobar,Caesar"""
sio = StringIO(csvdata)
pd.read_csv(sio, dtype={"user_id": int, "username": "string"})

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

DType通常是一个简单的东西,请在此处阅读更多关于它们的信息:http://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.html

我们可以访问 numpy dtypes:float、int、bool、timedelta64[ns] 和 datetime64[ns]。请注意,数字日期/时间 d 类型无法识别时区。

Pandas用自己的数据类型扩展了这组数据类型:

'datetime64[ns,

“category”本质上是一个枚举(由要保存的整数键表示的字符串)

period[]'不要与timedelta混淆,这些对象实际上锚定到特定的时间段

“稀疏”、“稀疏[int]、“稀疏[float]”用于稀疏数据或“有很多洞的数据”,而不是在数据帧中保存NaN或None,它省略了对象,节省了空间。

Interval本身就是一个主题,但它的主要用途是用于索引。在这里查看更多

“Int8”、“Int16”、“Int32”、“Int64”、“UInt8”、“UInt16”、“UInt32”、“UInt64”都是熊猫特有的可为空的整数,与numpy变量不同。

“string”是用于处理字符串数据的特定 dtype,并允许访问序列上的 .str 属性。

“boolean”类似于numpy“bool”,但它也支持缺失数据。

阅读此处的完整参考:

熊猫数据类型参考

设置 dtype=object 会使上述警告静音,但不会使其内存效率更高,只会使进程效率更高。

设置dtype=Unicode不会做任何事情,因为对于numpy,Unicode表示为对象

@sparrow正确地指出了转换器的使用,以避免熊猫在指定为<code>int时爆炸。我想补充一点,在熊猫身上使用转换器确实很重,效率很低,应该作为最后手段使用。这是因为read_csv进程是单个进程。

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

 类似资料:
  • 问题内容: 打电话时 我得到: /Users/josh/anaconda/envs/py27/lib/python2.7/site- packages/pandas/io/parsers.py:1130:DtypeWarning:列(4,5,7,16)具有混合类型。在导入时指定dtype选项,或将low_memory = False设置为false。 为什么选项与关联,为什么使它有助于解决此问题?

  • 问题内容: 我在pandas中有一个数据框,我试图找出其值的类型。我不确定column的类型是什么。但是,当我跑步时,我得到了; 这是什么意思? 问题答案: 它的意思是: 来源。 第一个字符指定数据的类型,其余字符指定每个项目的字节数,Unicode除外,Unicode将其解释为字符数。项目大小必须与现有类型相对应,否则将引发错误。支持的类型为现有类型,否则将引发错误。支持的种类有:

  • 我有一个63 MB的csv文件和患者的血液测试。我无法获得DataFrame。它说: 类型警告:列(5,12,20,21,22,23,24,25,26,30,32,35,36,37,38,39,40,41,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64请在导入时指定dtype选项,或者设置low_memory=Fa

  • 我正在使用此数据框: 我想通过名称和水果将其聚合,得到每个名称的水果总数。 我试着按名字和水果分组,但如何得到水果的总数呢。

  • 我必须根据以下col1、col2和loc的数据进行分组,并计算col3中的项数。此外,还应考虑开始和结束日期,即日期应在2021 1月1日至2021 1月31日之间。最终结果应显示在col4中。 数据 预期输出

  • 我今天观察到,选择两列或更多列的数据帧可能比只选择一列慢得多。 如果我使用loc或iloc选择多个列,并且我使用list传递列名或索引,那么与使用iloc的单个列或多个列选择相比,性能会下降100倍(但没有传递列表) 示例: 单列选择: 两列选择: 只有此选择的工作方式与预期相同:[编辑] 机制上的差异是什么?为什么差异如此之大? [编辑]:正如@run-out指出的,pd。系列似乎比pd处理得快