Отримайте pandas.read_csv для читання порожніх значень як порожнього рядка замість nan


101

Я використовую бібліотеку pandas для читання деяких даних CSV. У моїх даних певні стовпці містять рядки. Рядок "nan"- це можливе значення, як і порожній рядок. Мені вдалося змусити панд читати "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 остаточної), якщо вказати порожній список na_values, порожні рядки залишатимуться порожніми рядками в результаті


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

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

10
Документація для read_csv тепер пропонує як na_values(список, або індекс, індексований стовпцями), так і keep_default_na(bool). keep_default_naЗначення вказує значення NA панд по замовчуванням повинні бути замінені або додані до. Наразі код OP не працює лише тому, що в ньому відсутній цей прапор. Для цього прикладу ви можете використати pandas.read_csv('test.csv',na_values=['nan'], keep_default_na=False).
Michael Delgado

@delgadom Дякую, що підвів мене до keep_default_na. Але зверніть увагу, що він також не хоче, щоб `` нан '' розглядався як за замовчуванням. Я додав більш повне пояснення як нову відповідь.
nealmcb

знову натрапив на це. виправити це легко (найкраща відповідь наведена нижче keep_default_na=False), але поведінка панд за замовчуванням щодо цього є поганою в 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 чітко пояснює, як працює вищезазначений аргумент.

Посилання


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