小能豆

Pandas read_csv:low_memory 和 dtype 选项

javascript

df = pd.read_csv('somefile.csv')

…出现错误:

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

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


阅读 52

收藏
2024-08-26

共1个答案

小能豆

当你使用 pandas 读取 CSV 文件时,出现的 DtypeWarningpandas 在加载大型数据集时如何管理内存有关。让我们详细解释为什么 dtype 选项和 low_memory 选项相关,以及为什么将 low_memory 设置为 False 可能会有所帮助。

理解警告

  • DtypeWarning: 这个警告表明你的 CSV 文件中的某些列(特别是第 4、5、7 和 16 列)包含混合数据类型(例如,一个列中既有字符串又有数字)。这种情况可能发生在 pandas 尝试推断列的数据类型时,发现列中的数据类型不一致。

low_memory 参数

  • low_memory=True(默认值): 当 low_memory 设置为 True 时,pandas 会分块读取 CSV 文件,而不是一次性将整个文件加载到内存中。这种方法对大文件更为节省内存,但可能会导致数据类型推断问题。因为 pandas 是按块处理数据的,它可能最初为某列推断出一种数据类型,但在后面的块中发现冲突的数据类型,从而导致混合类型并触发 DtypeWarning

  • low_memory=False: 当你将 low_memory 设置为 False 时,pandas 会一次性将整个文件加载到内存中。这使得 pandas 可以更准确地推断列的数据类型,因为它可以一次性看到所有数据,从而减少在列中遇到混合类型的可能性。因此,你可能会避免 DtypeWarning

为什么 low_memory=False 会有帮助?

low_memory=False 设置时,pandas 会将整个文件一次性加载到内存中,这样可以:

  1. 更好地推断数据类型: 由于 pandas 是一次性处理整个列的,所以它可以更准确地确定每列的正确数据类型,避免由于不一致导致的 DtypeWarning

  2. 减少数据类型碎片化: 一次性加载文件减少了处理块时不同数据类型冲突的可能性。

dtype 选项

  • dtype 参数: dtype 参数允许你明确指定 CSV 中每列的数据类型。如果你已经知道了预期的数据类型,这个参数可以防止 pandas 尝试推断数据类型,从而避免可能的警告或错误。

解决方案示例

为了避免警告,你可以选择:

  1. 设置 low_memory=False:
    python df = pd.read_csv('somefile.csv', low_memory=False)

  2. 明确指定 dtype(如果你知道数据类型):
    python df = pd.read_csv('somefile.csv', dtype={'column_name': 'desired_type'})

结论

low_memory 设置为 False 会有所帮助,因为它允许 pandas 一次性读取整个 CSV 文件,从而导致更准确的数据类型推断。然而,如果你处理的是非常大的文件,你可能需要明确指定 dtype 以更高效地管理内存使用。

2024-08-26