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

发布于 2021-01-29 14:11:07

我有一个制表符分隔的文件,其中的一列应解释为字符串,但是许多条目都是整数。对于较小的文件,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

关注者
0
被浏览
80
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您在这里欺骗了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存储数据帧



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看