2013-06-13 9 views
37

Czy jest jakaś metoda zamiany wartości na None w Pandas w Pythonie?Jak zamienić wartości na Brak w ramce danych Pand w Pythonie?

Możesz użyć df.replace('pre', 'post') i możesz zamienić wartość na inną, ale nie można tego zrobić, jeśli chcesz zastąpić wartością None, co przy próbie daje dziwny wynik.

Tak oto przykład:

df = DataFrame(['-',3,2,5,1,-5,-1,'-',9]) 
df.replace('-', 0) 

która zwraca pomyślnego rezultatu.

Ale

df.replace('-', None) 

która zwraca następujący wynik:

0 
0 - // this isn't replaced 
1 3 
2 2 
3 5 
4 1 
5 -5 
6 -1 
7 -1 // this is changed to `-1`... 
8 9 

Dlaczego taki dziwny wynik zostać zwrócony?

Ponieważ chcę wlać tę ramkę danych do bazy danych MySQL, nie mogę umieścić wartości NaN w żadnym elemencie w mojej ramce danych, a zamiast tego chcę wstawić None. Z pewnością można najpierw zmienić '-' na NaN, a następnie przekonwertować NaN na None, ale chcę wiedzieć, dlaczego ramka danych działa w tak straszliwy sposób.

+0

Czy 'write_frame' nie analizować' NaN's na 'none's? –

+0

Yup. Napotkasz 'InternalError: (1054, u" Nieznana kolumna 'nan' w 'liście pól' ")' error. Nie wiem o żadnych rozwiązaniach innych niż konwersja 'NaN' na' None' przed wykonaniem metody 'write_frame'. – Blaszard

+0

Którą wersję pandy używasz? –

Odpowiedz

51

Właściwie w nowszych wersjach pandy to da Błąd typu:

df.replace('-', None) 
TypeError: If "to_replace" and "value" are both None then regex must be a mapping 

Można to zrobić przekazując albo listy lub słownika:

In [11]: df.replace('-', df.replace(['-'], [None]) # or .replace('-', {0: None}) 
Out[11]: 
     0 
0 None 
1  3 
2  2 
3  5 
4  1 
5 -5 
6 -1 
7 None 
8  9 

Ale zalecamy korzystanie Nans zamiast Brak:

In [12]: df.replace('-', np.nan) 
Out[12]: 
    0 
0 NaN 
1 3 
2 2 
3 5 
4 1 
5 -5 
6 -1 
7 NaN 
8 9 
+7

Lub po prostu listę, np. 'df.replace (['-'], [None])' lub 'df.replace ({'-': None})', myślę. Użycie 'None' jako sentinel wyklucza używanie go również jako wartości .. – DSM

+0

@DSM oooh znacznie lepiej, yoinked! :) –

+0

To jest niesamowite. Nie mogę wymyślić przypisania listy jako argumentów. Dziękuję Ci! – Blaszard

11

where to prawdopodobnie to, czego szukasz. Więc

data=data.where(data=='-', None) 

Z panda docs:

where [returns] an object of same shape as self and whose corresponding entries are from self where cond is True and otherwise are from other).

+0

Prosty i precyzyjny! Dziękuję Ci. – Juan

+3

To jest rzeczywiście niedokładne. data = data.where (dane == '-', brak) zastąpi wszystko, co NIE jest RÓWNE, aby "-" z Brak. Wersja Pandy gdzie zachowuje wartość pierwszego argumentu (w tym przypadku dane == '-') i zastępuje cokolwiek innego drugim argumentem (w tym przypadku Brak). Jest to trochę mylące, np. Gdzie jest bardziej jednoznaczne w tym, że prosi o warunkowe w pierwszym arg, następnie jeśli jest prawdziwe w drugim arg, to jeśli jest fałszywe w trzecim arg. – clg4

Powiązane problemy