2013-08-25 7 views
20

że mam kolumny w dataframe że ma kilka numerów i pewne numeryPandy: Konwersja do numerycznego, tworząc Nans gdy konieczne

>> df['foo'] 
0  0.0 
1  103.8 
2  751.1 
3  0.0 
4  0.0 
5   - 
6   - 
7  0.0 
8   - 
9  0.0 
Name: foo, Length: 9, dtype: object 

Jak mogę przekonwertować tę kolumnę do np.float, i wszystko inne który nie jest zmiennoprzecinkowy, przekształcić go w NaN?

Kiedy próbuję:

>> df['foo'].astype(np.float) 

lub

>> df['foo'].apply(np.float) 

uzyskać ValueError: could not convert string to float: -

Odpowiedz

35

W pand 0.17.0convert_objects podnieść ostrzeżenie:

FutureWarning: convert_objects jest nieaktualna. Użyj specyficznych konwerterów danych typu: pd.to_datetime, pd.to_timedelta i pd.to_numeric.

Można użyć metody pd.to_numeric i zastosować ją do ramki danych z arg coerce.

df1 = df.apply(pd.to_numeric, args=('coerce',)) 

lub może być w bardziej odpowiedni sposób:

df1 = df.apply(pd.to_numeric, errors='coerce') 

EDIT

Metoda ta obowiązuje tylko dla pand wersji> = 0.17.0 z docs what's new in pandas 0.17.0:

pd .to_numeric to nowa funkcja wymuszająca ciągi na liczbach (poz sibly z przymusu) (GH11133)

+2

Po tym krzyku powróciły palce, była to wielka srebrna kula. –

+0

Obiekt "moduł" nie ma atrybutu "to_numeric"? – bgenchel

+0

pokaż wersję edytowaną, jest dostępna tylko w wersji pandasowej '0.17.0' –

7

najpierw wymienić wszystkie wartości ciągów z None, aby oznaczyć je jako brakujących wartości, a następnie przekształcić go pływak.

df['foo'][df['foo'] == '-'] = None 
df['foo'] = df['foo'].astype(float) 
+0

Dziękujemy! Dobry i prosty. –

+0

Proste i działa znacznie lepiej niż poprzednie sugestie. –

+0

ten gest działa dla mnie ... jakiś pomysł? – ngakak

31

Użyj metody convert_objects Series (i convert_numeric):

In [11]: s 
Out[11]: 
0 103.8 
1 751.1 
2  0.0 
3  0.0 
4  - 
5  - 
6  0.0 
7  - 
8  0.0 
dtype: object 

In [12]: s.convert_objects(convert_numeric=True) 
Out[12]: 
0 103.8 
1 751.1 
2  0.0 
3  0.0 
4  NaN 
5  NaN 
6  0.0 
7  NaN 
8  0.0 
dtype: float64 

Uwaga: to jest również dostępny jako metoda DataFrame.

+1

"Próba wywnioskowania lepszego dtype dla kolumn obiektu" jest w zasadzie magicznym pociskiem ... (i to też się dzieje.) –

+0

dziękuję !!! ta metoda powinna znajdować się w każdym samouczku o pandach. – delgadom

+0

@delgadom zaskakująco nie ma sekcji "czyszczenia" w [10-minutowym samouczku] (http://pandas.pydata.org/pandas-docs/stable/10min.html). Muszę dokończyć książkę :) –

1

można po prostu użyć pd.to_numeric i ustawienie błędu do coerce bez użycia apply

df['foo'] = pd.to_numeric(df['foo'], errors='coerce') 
Powiązane problemy