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

3wabscal  于 2023-03-05  发布在  其他
关注(0)|答案(2)|浏览(182)

我希望panda 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"

ozxc1zmp

ozxc1zmp1#

根据文件的大小,一种解决方案是在内存中预处理文件,以便使用python io.StringIO将所有出现的||替换为|NaN|

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: ><
slwdgvem

slwdgvem2#

在这个问题中有三个独立的问题:
1.使用管道符号的柱Separation,参数:pandas.read_csv( sep='|' )
1.使用的Quote character是双引号,参数:pandas.read_csv( quotechar='"' )
1.列的数据类型需要为字符串或数字,参数:dtype={"COLUMN_EMPTY_STRING": 'string'}将强制所有值为基元字符串,包括空值

相关问题