我有一个制表符分隔的文件,其中的一列应解释为字符串,但是许多条目都是整数。对于较小的文件,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都是出色的解决方案,它们不会受到此类解析错误的影响(并且速度会更快)。