2016-10-17 15 views
5

Mam obiekt DataFrame pandy o nazwie xiv, który ma kolumnę int64 pomiarów objętości.Kiedy zastosować (pd.to_numeric) i kiedy astype (np.float64) w python?

In[]: xiv['Volume'].head(5) 
Out[]: 

0 252000 
1 484000 
2  62000 
3 168000 
4 232000 
Name: Volume, dtype: int64 

Czytałem inne posty (jak this i this), które sugerują następujące rozwiązania. Ale kiedy użyć podejście, nie wydaje się, aby zmienić dtype z danych podstawowych:

In[]: xiv['Volume'] = pd.to_numeric(xiv['Volume']) 

In[]: xiv['Volume'].dtypes 
Out[]: 
dtype('int64') 

albo ...

In[]: xiv['Volume'] = pd.to_numeric(xiv['Volume']) 
Out[]: ###omitted for brevity### 

In[]: xiv['Volume'].dtypes 
Out[]: 
dtype('int64') 

In[]: xiv['Volume'] = xiv['Volume'].apply(pd.to_numeric) 

In[]: xiv['Volume'].dtypes 
Out[]: 
dtype('int64') 

Próbowałem zostały również dzięki czemu osobny pandy Series i używając metod wymienionych powyżej w tej Serii i ponownie przydzielając obiekt do obiektu , który jest obiektem pandas.core.series.Series.

Mam jednak znalazł rozwiązanie tego problemu przy użyciu pakietu za numpyfloat64 typ - to działa, ale nie wiem dlaczego jest inaczej.

In[]: xiv['Volume'] = xiv['Volume'].astype(np.float64) 

In[]: xiv['Volume'].dtypes 
Out[]: 
dtype('float64') 

Może ktoś wyjaśnić, w jaki sposób osiągnąć z biblioteki pandas co wydaje biblioteka numpy łatwo zrobić z float64 klasie; to jest, przekonwertuj kolumnę w DataFrame xiv na float64 w miejscu.

+0

'int64' jest już" numerycznym "dtype. 'to_numeric()' powinno pomóc konwertować ciągi znaków w numeryczne dpy ... – MaxU

+0

cytowany post pokazuje, że 'dtype' zwrócony przez wywołanie' to_numeric' będzie 'float64' ... – d8aninja

+0

Sprawdź to:' pd.to_numeric (pd. Seria (['1', '2', '3'])). Dtype'. Będzie on float64 tylko wtedy, gdy będzie to konieczne: 1. W Serii są/są wartości NaN lub niewymienialne. 2. W serii są pływaki. – MaxU

Odpowiedz

10

Jeśli masz już dtypes numerycznych (int8|16|32|64, float64, boolean) można przekonwertować go na inny "numerycznej" dtype wykorzystaniem pandy.astype() metody.

Demo:

In [90]: df = pd.DataFrame(np.random.randint(10**5,10**7,(5,3)),columns=list('abc'), dtype=np.int64) 

In [91]: df 
Out[91]: 
     a  b  c 
0 9059440 9590567 2076918 
1 5861102 4566089 1947323 
2 6636568 162770 2487991 
3 6794572 5236903 5628779 
4 470121 4044395 4546794 

In [92]: df.dtypes 
Out[92]: 
a int64 
b int64 
c int64 
dtype: object 

In [93]: df['a'] = df['a'].astype(float) 

In [94]: df.dtypes 
Out[94]: 
a float64 
b  int64 
c  int64 
dtype: object 

To nie będzie działać dla object (String) dtypes, że nie może być konwertowane na liczby:

In [95]: df.loc[1, 'b'] = 'XXXXXX' 

In [96]: df 
Out[96]: 
      a  b  c 
0 9059440.0 9590567 2076918 
1 5861102.0 XXXXXX 1947323 
2 6636568.0 162770 2487991 
3 6794572.0 5236903 5628779 
4 470121.0 4044395 4546794 

In [97]: df.dtypes 
Out[97]: 
a float64 
b  object 
c  int64 
dtype: object 

In [98]: df['b'].astype(float) 
... 
skipped 
... 
ValueError: could not convert string to float: 'XXXXXX' 

Więc chcemy wykorzystać pd.to_numeric() metoda:

In [99]: df.b = pd.to_numeric(df['b'], errors='coerse') 

In [100]: df 
Out[100]: 
      a   b  c 
0 9059440.0 9590567.0 2076918 
1 5861102.0  NaN 1947323 
2 6636568.0 162770.0 2487991 
3 6794572.0 5236903.0 5628779 
4 470121.0 4044395.0 4546794 

In [101]: df.dtypes 
Out[101]: 
a float64 
b float64 
c  int64 
dtype: object