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

在巨大的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

我很确定这是一个bug,但是希望能够使用引用来解决这个问题,尽管添加quoting=csv.quote_nonnumeric用于读写并不能解决这个问题。理想情况下,我可以通过引用我的字符串数据来解决这一问题,并且以某种方式迫使pandas不对引用的数据进行任何推断。

使用pandas 0.12.0

共有1个答案

通学真
2023-03-14

您在这里欺骗了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)

注意:如果您正在寻找存储数据流的解决方案,例如在会话之间存储数据流,那么pickle和HDF5Store都是极好的解决方案,它们不会受到这些类型的解析错误的影响(并且会更快)。参见:如何使用PANDAS、Python存储数据帧

 类似资料:
  • 问题内容: 我有一个制表符分隔的文件,其中的一列应解释为字符串,但是许多条目都是整数。对于较小的文件,read_csv在看到一些非整数值后可以正确地将列解释为字符串,但是对于较大的文件,此方法无效: 输出: 有趣的是262144是2的幂,因此我认为推理和转换正在大块中进行,但正在跳过一些大块。 我相当确定这是一个错误,但是希望解决这个问题,尽管使用quoting = csv.QUOTE_NONNU

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

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

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

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

  • 我有一个随机地址字符串,如 我想将其拆分为具有两个条件的字符串数组: 该字符串数组的每个元素的长度小于或等于20 字符串数组的元素没有尴尬的结尾 例如,每20个字符拆分将产生: 但正确的输出是: 注意字符串数组中的每个元素是如何小于或等于20的。 以上是我对这段代码的输出: