Skip to main content
 首页 » 编程设计

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

2025年05月04日19haluo1

我希望 pandas read_csv 能够将以下示例文本正确读入 DataFrame:

“INDEX”|“COLUMN_STRING”|“COLUMN_INTEGER”|“COLUMN_EMPTY”|“COLUMN_EMPTY_STRING” 1|“字符串”|21||“”

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

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

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

此外,使用 dtype={"COLUMN_EMPTY_STRING": str} 也没有帮助。
有人知道这个泡菜的解决方案吗?

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

请您参考如下方法:

根据文件的大小,一种解决方案是在内存中预处理文件,将所有出现的 || 替换为 |NaN|,使用python 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: ><