Как заставить pandas read_csv различать nan и пустую строку

Я хотел бы, чтобы 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" из файла.


person user3055017    schedule 01.12.2013    source источник


Ответы (1)


В зависимости от размера файла одним из решений может быть предварительная обработка файла в памяти, чтобы заменить все вхождения || на |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: ><
person behzad.nouri    schedule 01.12.2013
comment
Я попробовал ваше решение, но оно присваивает тип int64 такому значению, как |"12"|. Я хотел бы, чтобы он сохранил его как строку. Но я согласен с той частью, где вы меняете || на |NaN|, хотя хотелось бы найти решение без дополнительного преобразования строк. - person user3055017; 02.12.2013
comment
@user3055017 user3055017 я думаю, что если все значения в столбце являются числами в кавычках, столбец преобразуется в числовой тип; вы можете либо указать dtype={"COLUMN_STRING": str} в качестве одного из аргументов, либо сделать df.COLUMN_STRING = df.COLUMN_STRING.astype( str ) после чтения данных - person behzad.nouri; 02.12.2013