Получите pandas.read_csv для чтения пустых значений как пустой строки вместо nan


102

Я использую библиотеку pandas для чтения некоторых данных CSV. В моих данных некоторые столбцы содержат строки. Строка "nan"является возможным значением, как и пустая строка. Мне удалось заставить pandas читать «nan» как строку, но я не могу понять, как заставить его не читать пустое значение как NaN. Вот пример данных и вывод

One,Two,Three
a,1,one
b,2,two
,3,three
d,4,nan
e,5,five
nan,6,
g,7,seven

>>> pandas.read_csv('test.csv', na_values={'One': [], "Three": []})
    One  Two  Three
0    a    1    one
1    b    2    two
2  NaN    3  three
3    d    4    nan
4    e    5   five
5  nan    6    NaN
6    g    7  seven

Он правильно читает «нан» , как строка «нан», но по- прежнему читает пустые ячейки как NaN. Я попытался переходящим в strв convertersаргументе read_csv (с converters={'One': str})), но он все еще читает пустые ячейки как NaN.

Я понимаю, что могу заполнить значения после прочтения с помощью fillna, но действительно ли нет способа сказать пандам, что пустая ячейка в конкретном столбце CSV должна читаться как пустая строка вместо NaN?


Обратите внимание на более простой ответ, используя более свежий вариант keep_default_naниже.
nealmcb

Ответы:


57

Я добавил билет, чтобы добавить здесь какую-то опцию:

https://github.com/pydata/pandas/issues/1450

А пока result.fillna('')делай что хочешь

РЕДАКТИРОВАТЬ: в разрабатываемой версии (будет 0.8.0 final), если вы укажете пустой список na_values, пустые строки останутся пустыми в результате


12
Документация для DataFrame.fillna. Попробуй result.fillna('', inplace=True). В противном случае он создает копию фрейма данных.
Сергей Оршанский

1
извините, что воскресил такой старый ответ, но случалось ли это когда-нибудь? Насколько я могу судить из этого PR на GitHub, он был закрыт без слияния, и я не вижу запрошенного поведения в pandas версии 0.14.x
drammock

10
Документация для read_csv теперь предлагает как na_values(список или dict, индексированный по столбцам), так и keep_default_na(bool). keep_default_naЗначение указывает значения NA панд по умолчанию должны быть заменены или добавлены к. Код OP в настоящее время не работает только потому, что отсутствует этот флаг. В этом примере вы можете использовать pandas.read_csv('test.csv',na_values=['nan'], keep_default_na=False).
Майкл Дельгадо,

@delgadom Спасибо, что привели меня к keep_default_na. Но обратите внимание, что он также не хочет, чтобы «nan» использовалось по умолчанию. Я добавил более полное объяснение в качестве нового ответа.
nealmcb

снова столкнулся с этим. исправить это легко (лучший ответ - как показано ниже keep_default_na=False), но поведение pandas по умолчанию в этом случае является плохим IMO. если по какой-то причине pandas read_csv делает вывод, что столбец не является числовым, он не должен автоматически изменять пустые строки на NaN.
pietroppeter

114

Я все еще был сбит с толку после прочтения других ответов и комментариев. Но теперь ответ кажется более простым, так что готово.

Начиная с версии Pandas 0.9 (с 2012 г.), вы можете читать свой csv с пустыми ячейками, интерпретируемыми как пустые строки, просто установив keep_default_na=False:

pd.read_csv('test.csv', keep_default_na=False)

Этот вопрос более подробно объясняется в

Это было исправлено 19 августа 2012 г. для Pandas версии 0.9 в


5
Это явно лучший ответ, его следует обозначить как первое решение. Спасибо @nealmcb
dzof31

3
Почему это не более популярный ответ? Искал это решение со вчерашнего дня. Благодарность!
аниш

7

В Pandas read_csv для этого есть простой аргумент:

Использование:

df = pd.read_csv('test.csv', na_filter= False)

Документация Pandas четко объясняет, как работает приведенный выше аргумент.

Ссылка на сайт


Похоже, что OP действительно хочет использовать na_valuesдля распознавания "nan", но полное na_filterотключение этого не сделает. Таким образом, мой ответ с keep_default_na=False.
nealmcb
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.