【发布时间】: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(),这应该可以很容易地发现有问题的值。