Pobierz pandas.read_csv, aby odczytać puste wartości jako pusty ciąg zamiast nan

101

Używam biblioteki pandas do wczytywania niektórych danych CSV. W moich danych niektóre kolumny zawierają ciągi. Ciąg "nan"jest możliwą wartością, podobnie jak pusty ciąg. Udało mi się zmusić pandy do odczytywania „nan” jako ciągu znaków, ale nie wiem, jak to zrobić, aby nie odczytywać pustej wartości jako NaN. Oto przykładowe dane i wyniki

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

To właściwie brzmi „nan” jako strun „nan”, ale nadal odczytuje pustych komórek jak Nan. Próbowałem przekazując strw convertersargumencie do read_csv (z converters={'One': str})), ale nadal odczytuje pustych komórek jak Nan.

Zdaję sobie sprawę, że po przeczytaniu mogę wypełnić wartości fillna, ale czy naprawdę nie ma sposobu, aby powiedzieć pandom, że pusta komórka w określonej kolumnie CSV powinna być odczytywana jako pusty ciąg zamiast NaN?

BrenBarn
źródło
Zwróć uwagę na prostszą odpowiedź, używając nowszej opcji keep_default_naponiżej.
nealmcb

Odpowiedzi:

57

Dodałem bilet, aby dodać tutaj jakąś opcję:

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

W międzyczasie result.fillna('')powinieneś robić, co chcesz

EDYCJA: w wersji rozwojowej (aby być ostateczną 0.8.0), jeśli określisz pustą listę na_values, puste ciągi pozostaną pustymi ciągami w wyniku

Wes McKinney
źródło
12
Dokumentacja dla DataFrame.fillna. Spróbuj result.fillna('', inplace=True). W przeciwnym razie tworzy kopię ramki danych.
Sergey Orshanskiy,
1
przepraszam za wskrzeszenie tak starej odpowiedzi, ale czy to się kiedykolwiek zdarzyło? O ile wiem z tego PR GitHub , został zamknięty bez scalania i nie widzę żądanego zachowania w pandach w wersji 0.14.x
drammock
10
Dokumentacja dla read_csv oferuje teraz zarówno na_values(lista lub dykt indeksowane według kolumn), jak i keep_default_na(bool). keep_default_naWartość wskazuje, czy domyślne wartości NA Pandy powinny być zastąpione lub dołączane do. Kod OP nie działa obecnie tylko dlatego, że brakuje w nim tej flagi. W tym przykładzie możesz użyć pandas.read_csv('test.csv',na_values=['nan'], keep_default_na=False).
Michael Delgado,
@delgadom Dzięki za poprowadzenie mnie do keep_default_na. Ale pamiętaj, że nie chce, aby „nan” było traktowane jako domyślne. Dodałem pełniejsze wyjaśnienie jako nową odpowiedź.
nealmcb
wpadłem na to ponownie. poprawka jest łatwa (najlepsza odpowiedź jest jak poniżej keep_default_na=False), ale domyślne zachowanie pand na tym jest złe IMO. jeśli z jakiegoś powodu panda read_csv wnioskuje, że kolumna nie jest numeryczna, nie powinna automatycznie zmieniać pustych łańcuchów na NaN.
pietroppeter
114

Po przeczytaniu innych odpowiedzi i komentarzy nadal byłem zdezorientowany. Ale teraz odpowiedź wydaje się prostsza, więc proszę bardzo.

Od wersji Pandy 0.9 (od 2012) możesz czytać swój plik csv z pustymi komórkami interpretowanymi jako puste ciągi, po prostu ustawiając keep_default_na=False:

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

Ta kwestia jest dokładniej wyjaśniona w

Zostało to naprawione 19 sierpnia 2012 dla Pand w wersji 0.9 in

nealmcb
źródło
5
To zdecydowanie najlepsza odpowiedź, należy ją określić jako pierwsze rozwiązanie. Dzięki @nealmcb
dzof31
3
Dlaczego nie jest to bardziej popularna odpowiedź? Tego rozwiązania szukałem od wczoraj. Dzięki!
anish
7

W Pandas read_csv mamy na to prosty argument:

Posługiwać się:

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

Dokumentacja Pandy jasno wyjaśnia, jak działa powyższy argument.

Połączyć

Sundeep
źródło
Wygląda na to, że PO nie chce używać na_valuesrozpoznać „NaN”, ale obracając na_filtersię całkowicie, że będzie pokonać. Tak więc moja odpowiedź z keep_default_na=False.
nealmcb