2012-06-03 12 views
31

Używam biblioteki pand do odczytywania w 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 znaków. Udało mi się przekonać pandy, żeby przeczytały "nan" jako ciąg znaków, ale nie wiem, jak to zrobić, żeby nie czytać pustej wartości jako NaN. Oto przykładowe dane i wyjściePobierz pandas.read_csv, aby odczytać puste wartości jako pusty ciąg znaków zamiast 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 

on prawidłowo czyta „nan” jako ciąg „nan”, ale nadal odczytuje pustych komórek jak Nan. Próbowałem przechodzącą w str w converters argument read_csv (z converters={'One': str})) ale wciąż czyta puste komórki jako NaN:

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

Odpowiedz

27

I dodaje bilet dodać opcję jakiś tutaj:

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

W międzyczasie result.fillna('') powinien robić to, co chcesz

EDIT: w wersji rozwojowej (do 0,8 .0 końcowy) jeśli podasz pustą listę na_values, puste ciągi pozostaną pustymi ciągami w wyniku

+6

[Dokumentacja dla 'DataFrame.fillna'.] (Http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html) Wypróbuj' result.fillna ('', inplace = True) '. W przeciwnym razie tworzy kopię ramki danych. – osa

+1

Przepraszam, że wskrzesiłem tak starą odpowiedź, ale czy to się kiedykolwiek zdarzyło? O ile mogę powiedzieć od [to GitHub PR] (https: // github.com/pydata/pandas/pull/1522) została zamknięta bez żadnego scalenia i nie widzę żądanego zachowania w pandach wersji 0.14.x – drammock

+7

[Dokumentacja] (http://pandas.pydata.org/pandas- docs/stable/generated/pandas.read_csv.html) dla read_csv oferuje teraz zarówno "na_values" (lista lub dict indeksowane przez kolumny) i 'keep_default_na' (bool). Wartość 'keep_default_na' wskazuje, czy domyślne wartości NA powinny być zastąpione lub dołączone. Kod OP nie działa obecnie tylko dlatego, że brakuje tej flagi. W tym przykładzie możesz użyć 'pandas.read_csv ('test.csv', na_values ​​= ['nan'], keep_default_na = False)'. – delgadom

-1

Użyj metody fillna, ale użyj jej dwukrotnie "nan" = "nan", "NaN" = "". To utrzymywałoby przecinek w porządku. Jeśli nie było NAN, kolumny nie byłyby wyrównane. Pamiętaj: nan nie równa się NaN.

+1

Nie rozumiem odpowiedź. Jak już powiedziałem, nie chcę używać fillna ani żadnego innego wywołania metody po odczytaniu. Pytam, czy istnieje sposób na dokonanie konwersji podczas operacji odczytu CSV. – BrenBarn

+0

Daj spokój, naprawdę ?! Twoje pytanie nie jest jasne. P: Dokonaj konwersji podczas operacji odczytu CSV. A: Nie, zadałem to samo pytanie wcześniej, TAK, skasowałem to. Musisz postępować w dwóch etapach. To samo dotyczy modułu CSV, dwa kroki. – Merlin

12

Po odczytaniu pozostałych odpowiedzi i komentarzy nadal byłem zakłopotany. Ale odpowiedź wydaje się teraz prostsza, więc proszę.

Od Pandy wersja 0.9 (od 2012), można odczytać CSV z pustych komórek interpretowane jako pustych strun, po prostu ustawiając keep_default_na=False:

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

Ten problem jest bardziej jasno wyjaśnione w

To zostało ustalone na 19 sierpnia 2012 dla wersji Pand w wersji 0.9 w

Powiązane problemy