如何强制pandas read_csv区分nan和空字符串

时间:2013-12-01 20:32:51

标签: python csv pandas

我想pandas read_csv正确地将以下示例文本读入DataFrame:

"INDEX"|"COLUMN_STRING"|"COLUMN_INTEGER"|"COLUMN_EMPTY"|"COLUMN_EMPTY_STRING" 1|"string"|21||""

我需要解析的文件包含应该用""包裹的字符串的所有值。 应为NaN的值没有双引号,例如:||

我希望read_csv将所有“引用”值保持为字符串,也是"",但是 它强制NaN作为""的默认值。

如果我使用keep_default_na=False,则会将空字符串''设置为|||""|

此外,使用dtype={"COLUMN_EMPTY_STRING": str}也无济于事 有人知道这个泡菜的解决方案吗?

另一种可能的解决方案是使用quoting=3。这将使字符串保持为"string",这可以在解析后解决。我不能使用它,因为我提供index_col参数,这会引发错误,因为它无法找到,例如INDEX,因为它从文件中读取"INDEX"

1 个答案:

答案 0 :(得分:0)

根据文件的大小,一种解决方案可以是在内存中预处理文件,使用python || |NaN| io.StringIO的所有出现次数>

import io
from pandas.io.parsers import read_csv

with open( 'test.csv', 'r' )  as fin:
    with io.StringIO( fin.read( ).replace( '||', '|NaN|' )) as ios:
        df = read_csv( ios, na_values='NaN', sep='|',
                       index_col=["INDEX"], keep_default_na=False )

这就是df的样子:

      COLUMN_STRING  COLUMN_INTEGER  COLUMN_EMPTY COLUMN_EMPTY_STRING
INDEX                                                                
1            string              21           NaN                    

验证:

print ( 'empty: >{}<, empty string: >{}<'.format( df.COLUMN_EMPTY[ 1 ], 
                                                  df.COLUMN_EMPTY_STRING[ 1 ] ))
empty: >nan<, empty string: ><