一尘不染

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

python

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


阅读 182

收藏
2021-01-20

共1个答案

一尘不染

您在这里欺骗了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都是出色的解决方案,它们不会受到此类解析错误的影响(并且速度会更快)。

2021-01-20