当前位置: 首页 > 面试题库 >

巨大的TSV文件中的大整数字符串列上的pandas read_csv dtype推断不一致

胡鸿羲
2023-03-14
问题内容

我有一个制表符分隔的文件,其中的一列应解释为字符串,但是许多条目都是整数。对于较小的文件,read_csv在看到一些非整数值后可以正确地将列解释为字符串,但是对于较大的文件,此方法无效:

import pandas as pd
df = pd.DataFrame({'a':['1']*100000 + ['X']*100000 + ['1']*100000, 'b':['b']*300000})
df.to_csv('test', sep='\t', index=False, na_rep='NA')
df2 = pd.read_csv('test', sep='\t')
print df2['a'].unique()
for a in df2['a'][262140:262150]:
    print repr(a)

输出:

['1' 'X' 1]
'1'
'1'
'1'
'1'
1
1
1
1
1
1

有趣的是262144是2的幂,因此我认为推理和转换正在大块中进行,但正在跳过一些大块。

我相当确定这是一个错误,但是希望解决这个问题,尽管使用quoting =
csv.QUOTE_NONNUMERIC进行读取和写入无法解决问题。理想情况下,我可以通过引用我的字符串数据来解决此问题,并以某种方式强制熊猫不要对引用的数据进行任何推断。

使用熊猫0.12.0


问题答案:

您在这里欺骗了read_csv解析器(为了公平起见,无论您扔给它什么,我都不 总是
期望它能够正确输出)…但是,这可能是一个错误!

正如@Steven指出的那样,您可以使用read_csv的converters参数:

df2 = pd.read_csv('test', sep='\t', converters={'a': str})

一个懒惰的解决方案是在阅读文件后进行修补:

In [11]: df2['a'] = df2['a'].astype('str')

# now they are equal
In [12]: pd.util.testing.assert_frame_equal(df, df2)

注意:如果您正在寻找 一种解决方案来存储DataFrame
,例如在会话之间,则pickle和HDF5Store都是出色的解决方案,它们不会受到此类解析错误的影响(并且速度会更快)。 请参阅:
如何使用PANDAS,Python存储数据帧



 类似资料:
  • 我有一个以制表符分隔的文件,其中有一列应该解释为字符串,但许多条目都是整数。对于小文件,read_csv在看到一些非整数值后会正确地将列解释为字符串,但是对于较大的文件,这就不起作用了: 输出: 我很确定这是一个bug,但是希望能够使用引用来解决这个问题,尽管添加quoting=csv.quote_nonnumeric用于读写并不能解决这个问题。理想情况下,我可以通过引用我的字符串数据来解决这一问

  • 问题内容: 我有一个很大的文本文件,但是没有换行符。它只包含一个很长的字符串(包含所有ASCII字符的1行巨大的字符串),但是到目前为止一切正常,因为我可以将整行读入Java的内存中,但是我想知道是否有内存由于文件变得如此之大(如5GB +),并且程序无法一次将整个文件读入内存,因此出现泄漏问题,那么在那种情况下,读取此类文件的最佳方法是什么?我们可以将巨大的线条分成2个部分,甚至多个块吗? 这是

  • 问题内容: 我需要发布一个大约3mb的巨大字符串,是否可以不使用URL参数将其发送到php? 如果我通过url参数发送请求,则请求达到url中的大小限制。 如何解决呢?有什么线索吗? 非常感谢。 其实我正在这样做: 我正在使用PHP和jQuery,并且我愿意将3mb base64字符串发送到简单网址上的php中,例如 该字符串是File Reader API base64映像 这是一个字符串示例,

  • 我的问题是: > 如何使其与较大的文件一起工作? 有什么办法能让它快一点吗? 我的电脑有8GB的RAM,运行64位Windows 7,处理器是3.40GHz(不确定你需要什么信息)。

  • 问题内容: 我目前正在尝试从Python 2.7中的.csv文件中读取数据,该文件最多包含100万行和200列(文件范围从100mb到1.6gb)。对于少于300,000行的文件,我可以(非常缓慢地)执行此操作,但是一旦超过该行,就会出现内存错误。我的代码如下所示: 在getstuff函数中使用else子句的原因是,所有符合条件的元素都将一起列在csv文件中,因此当我经过它们时,为了节省时间,我离

  • 问题内容: 可以说我有一个表,其中包含发票编号列,数据类型为VARCHAR,具有混合的字符串/整数值,例如: 我试图选择最大值,但它返回的是“ HKL9”,而不是最高值“ HKL15”。 问题答案: (字符串)大于,因为它们被比较为字符串。解决问题的一种方法是定义一个仅返回发票编号数字部分的列函数。 如果您的所有发票编号均以开头,则可以使用: 它使用invoice_number(不包括前3个字符)