【问题标题】:pandas csv imports floats as str after row 65535 with no difference in source csv, set low_memory=False warning on importpandas csv 在第 65535 行之后将浮点数导入为 str,源 csv 没有区别,在导入时设置 low_memory=False 警告
【发布时间】:2022-12-08 06:37:45
【问题描述】:

我有一个 106k 行的 csv。 65530 到 65540 行是

65530.0,XX/USD,1643482694890045000,sell,8.793,0.3,True,65530.0,1.0,1.0,8.793,0.3,0.0,0.0
65531.0,XX/USD,1643482695820627000,sell,8.793,0.3,True,65531.0,1.0,1.0,8.793,0.3,0.0,0.0
65532.0,XX/USD,1643482696697503000,sell,8.793,0.3,True,65532.0,1.0,1.0,8.793,0.3,0.0,0.0
65533.0,XX/USD,1643482697716654000,sell,8.793,0.3,True,65533.0,1.0,1.0,8.793,0.3,0.0,0.0
65534.0,XX/USD,1643482698627121000,sell,8.793,0.3,True,65534.0,1.0,1.0,8.793,0.3,0.0,0.0
65535.0,XX/USD,1643482699821714000,sell,8.793,0.3,True,65535.0,1.0,1.0,8.793,0.3,0.0,0.0
65534.0,XX/USD,1643482698627121000,sell,8.793,0.3,True,65534.0,1.0,1.0,8.793,0.3,0.0,0.0
65535.0,XX/USD,1643482699821714000,sell,8.793,0.3,True,65535.0,1.0,1.0,8.793,0.3,0.0,0.0
65536.0,XX/USD,1643482700776673000,sell,8.793,0.3,True,65536.0,1.0,1.0,8.793,0.3,0.0,0.0
65537.0,XX/USD,1643482701707969000,sell,8.793,0.3,True,65537.0,1.0,1.0,8.793,0.3,0.0,0.0
65538.0,XX/USD,1643482702710212000,sell,8.793,0.3,True,65538.0,1.0,1.0,8.793,0.3,0.0,0.0

所以没有有趣的变化......

sum([type(df.price[x])!=float for x in range(0,df.shape[0])])
Out[146]: 40647
sum([type(df.price[x])==float for x in range(0,df.shape[0])])
Out[147]: 65536

出于某种原因,尽管最后 40647 行显示为 strs?

type(df.price[65536])
Out[149]: str
type(df.price[65535])
Out[150]: float

在 openoffice 或 sublime 文本编辑器中打开 csv 时,我不认为这是一个问题。大熊猫在做什么?

我只是香草进口。我确实收到了这个警告?

pd.read_csv(full_chosen_path_list[0])
<ipython-input-151-03a220273804>:1: DtypeWarning:
Columns (4,6) have mixed types. Specify dtype option on import or set low_memory=False.

我的电脑有 64gb 的 ram,大部分未使用,其他文件更大,格式相同,并且没有这个问题(超过 100 个类似的文件工作)

此外,第 4 列和第 6 列没有什么真正有趣的地方,为什么这些列有问题而其他列没有? 第 6 列是一个 bool 列,它也在第 65537 行变成 str

【问题讨论】:

  • 我的理解是,当 pandas 读取大文件时,它会分块读取。这意味着如果在一个块中 col 4 看起来像 [1,1,2,2,...] 但在另一个块中它是 [1,1,1,'A',...] 在一个块中 pandas 说“哦它是一个数字”另一个它说“不,col是一个对象”然后当它给你df时它会向上转换为对象因为数字类型不能容纳'A'。如果你设置low_memory = False那么它将解析整个文件立即避免上述情况。或者如果您明确指定 dtype 它将使用它(或抱怨它不能使用您指定的类型)
  • 基本上,在这些列的某处,您有一些错误数据,可能在第 65535 行之后。它可能像 '-' 或 '.' 一样良性,以指示空值,或者其中一个数字中的拼写错误。基本上如果熊猫不能阅读单身的值转换为正确的数据类型,它将在导入时向上转换整个列。这就是为什么大多数数据清理是在导入后使用 pd.to_numeric 等函数完成的,这些函数比 coerce 更强大,通常会破坏导入转换
  • 啊,所以在 65537 和 eof 之间的某处可能有一个字符串,然后它会自动将整个块设置为 str,甚至是非 strs? (编辑:看起来我们正在同时输入这个解释。明白了。)
  • 是的,熊猫系列的dtype需要能够存储每一个该列中的单个值。因此,如果您有一列 10 万亿个数字,但单行有字母“A”,则该系列的 dtype 需要是对象。 Ofc 您可以清理该列,以便将“A”替换为 NaN,然后​​它可以变成数字,但对于数据类型来说,它真的是全有或全无。
  • 对于布尔值列,检查 df['that_col'].unique(),这应该可以很容易地发现有问题的值。

标签: python arrays pandas csv


【解决方案1】:

听起来您的 CSV 文件中的数据存在一些问题,导致 Pandas 将某些值解释为字符串而不是浮点数。您看到的 DtypeWarning 表示 CSV 文件中某些列的数据类型存在一些不一致。

一个可能的原因是价格列中有一些值不能解析为浮点数,例如,如果它们包含字母或特殊字符。当 Pandas 遇到无法解析为浮点数的值时,它将将该值视为字符串。这可以解释为什么价格列的最后 40,647 行显示为字符串。

要解决此问题,您可以尝试使用 pd.read_csv() 函数中的 dtype 参数来指定 CSV 文件中每一列的数据类型。这将告诉 Pandas 将每列中的值解析为指定的数据类型,并有助于防止 Pandas 在无法将值解析为浮点数时将其解释为字符串。

下面是一个示例,说明如何使用 dtype 参数为 CSV 文件中的每一列指定数据类型:

# Read the CSV file, specifying the data types for each column
df = pd.read_csv(full_chosen_path_list[0], dtype={
    'column1': float,
    'column2': str,
    'column3': float,
    'column4': str,
    'column5': float,
    'column6': float,
    'column7': bool,
    'column8': float,
    'column9': float,
    'column10': float,
    'column11': float,
    'column12': float,
    'column13': float,
    'column14': float

})

在此示例中,dtype 参数是一个字典,其中键是 CSV 文件中列的名称,值是这些列的数据类型。您需要将此示例中的列名称和数据类型替换为适合您的 CSV 文件的值。

【讨论】:

  • 对否决票有什么解释吗?
  • 编辑以提供正确的列类型
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-14
  • 2013-09-23
  • 1970-01-01
  • 2012-12-31
  • 1970-01-01
  • 2011-06-16
相关资源
最近更新 更多