Konwertowanie ciągów na elementy zmiennoprzecinkowe w DataFrame

113

Jak ukryć kolumnę DataFrame zawierającą ciągi i NaNwartości na zmiennoprzecinkowe . Jest jeszcze jedna kolumna, której wartości są ciągami znaków i liczbami zmiennoprzecinkowymi; jak przekonwertować całą kolumnę na liczby zmiennoprzecinkowe.

Neer
źródło
7
NIE UŻYWAĆ convert_objects. Jest przestarzały. Użyj to_numericlub astypezamiast tego
Ted Petrou

Odpowiedzi:

72

UWAGA: pd.convert_objects został wycofany. Należy użyć pd.Series.astype(float)lub pd.to_numericzgodnie z opisem w innych odpowiedziach.

Jest to dostępne w wersji 0.11. Wymusza konwersję (lub ustawia na nan). Będzie to działać nawet wtedy astype, gdy się nie powiedzie; jego również seria po seriach, więc nie będzie konwertować, powiedzmy, pełnej kolumny łańcuchowej

In [10]: df = DataFrame(dict(A = Series(['1.0','1']), B = Series(['1.0','foo'])))

In [11]: df
Out[11]: 
     A    B
0  1.0  1.0
1    1  foo

In [12]: df.dtypes
Out[12]: 
A    object
B    object
dtype: object

In [13]: df.convert_objects(convert_numeric=True)
Out[13]: 
   A   B
0  1   1
1  1 NaN

In [14]: df.convert_objects(convert_numeric=True).dtypes
Out[14]: 
A    float64
B    float64
dtype: object
Jeff
źródło
Należy pamiętać, że to nie działa dla kolumn (w multiindeksie prowadzącym), działa tylko dla wartości w ramce danych
denfromufa
1
Musiałem użyć set_levels, aby przekonwertować ciąg na float
denfromufa
16
df['ColumnName'] = df['ColumnName'].convert_objects(convert_numeric=True)Możesz przekonwertować tylko jedną kolumnę.
Jack
19
to jest teraz pd.to_numeric (col) w nowszych wersjach
Jeff
11
Convert_objects jest przestarzały w nowszych pandach. Użyj konwerterów specyficznych dla typu danych pd.to_numeric.
Thomas Matthew
58

Możesz spróbować df.column_name = df.column_name.astype(float). Jeśli chodzi o NaNwartości, musisz określić, jak mają być konwertowane, ale możesz to zrobić za pomocą .fillnametody.

Przykład:

In [12]: df
Out[12]: 
     a    b
0  0.1  0.2
1  NaN  0.3
2  0.4  0.5

In [13]: df.a.values
Out[13]: array(['0.1', nan, '0.4'], dtype=object)

In [14]: df.a = df.a.astype(float).fillna(0.0)

In [15]: df
Out[15]: 
     a    b
0  0.1  0.2
1  0.0  0.3
2  0.4  0.5

In [16]: df.a.values
Out[16]: array([ 0.1,  0. ,  0.4])
korzeń
źródło
47

W nowszej wersji pand (0.17 i nowszych) możesz użyć funkcji to_numeric . Pozwala na konwersję całej ramki danych lub tylko pojedynczych kolumn. Daje również możliwość wyboru sposobu traktowania rzeczy, których nie można przekonwertować na wartości liczbowe:

import pandas as pd
s = pd.Series(['1.0', '2', -3])
pd.to_numeric(s)
s = pd.Series(['apple', '1.0', '2', -3])
pd.to_numeric(s, errors='ignore')
pd.to_numeric(s, errors='coerce')
Salvador Dali
źródło
32
Aby zastosować się pd.to_numericdo a DataFrame, można użyć, df.apply(pd.to_numeric)jak wyjaśniono szczegółowo w tej odpowiedzi .
Ninjakannon
31
df['MyColumnName'] = df['MyColumnName'].astype('float64') 
Claude COULOMBE
źródło
6
To nie działa, gdy konwertujesz ze String na Float:ValueError: could not convert string to float: 'date'
Jack
@Jack, czy znasz obejście tutaj? Napotykam dokładnie ten problem, konwertując ciąg na zmiennoprzecinkowy.
Hatt
@Hatt mam ten sam problem. czy znalazłeś na to rozwiązanie?
Prakhar Jhudele
@Jack Nie jestem pewien, ale wydaje się, że mieszasz format daty i zmiennoprzecinkowe. # konwersja do datetime df ['date'] = pd.to_datetime (df ['date'])
Claude COULOMBE
8

musisz zamienić puste łańcuchy ('') na np.nan przed konwersją na float. to znaczy:

df['a']=df.a.replace('',np.nan).astype(float)
Paul Mwaniki
źródło
1

Oto przykład

                            GHI             Temp  Power Day_Type
2016-03-15 06:00:00 -7.99999952505459e-7    18.3    0   NaN
2016-03-15 06:01:00 -7.99999952505459e-7    18.2    0   NaN
2016-03-15 06:02:00 -7.99999952505459e-7    18.3    0   NaN
2016-03-15 06:03:00 -7.99999952505459e-7    18.3    0   NaN
2016-03-15 06:04:00 -7.99999952505459e-7    18.3    0   NaN

ale jeśli to są wszystkie wartości ciągów ... tak jak w moim przypadku ... Zamień żądane kolumny na zmiennoprzecinkowe:

df_inv_29['GHI'] = df_inv_29.GHI.astype(float)
df_inv_29['Temp'] = df_inv_29.Temp.astype(float)
df_inv_29['Power'] = df_inv_29.Power.astype(float)

Twoja ramka danych będzie teraz miała wartości zmiennoprzecinkowe :-)

ArmandduPlessis
źródło