Konvertieren von Zeichenfolgen in Floats in einem DataFrame


111

Verdecken einer DataFrame-Spalte mit Zeichenfolgen und NaNWerten in Floats. Und es gibt eine andere Spalte, deren Werte Zeichenfolgen und Gleitkommazahlen sind. So konvertieren Sie diese gesamte Spalte in Floats.


7
NICHT VERWENDEN convert_objects. Es ist veraltet. Verwenden Sie to_numericoder astypestattdessen
Ted Petrou

Antworten:


72

HINWEIS: pd.convert_objects wurde jetzt veraltet. Sie sollten pd.Series.astype(float)oder pd.to_numericwie in anderen Antworten beschrieben verwenden.

Dies ist in 0.11 verfügbar. Konvertierung erzwingen (oder auf nan setzen) Dies funktioniert auch dann, wenn astypees fehlschlägt. Es ist auch Serie für Serie, so dass es keine vollständige Zeichenfolgenspalte konvertiert

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

Bitte beachten Sie, dass dies nicht für Spalten (bei Leadt Multiindex) funktioniert, sondern nur für Werte im Datenrahmen
denfromufa

1
Ich musste set_levels verwenden, um String in float zu konvertieren
denfromufa

16
df['ColumnName'] = df['ColumnName'].convert_objects(convert_numeric=True)Sie können nur eine einzelne Spalte konvertieren.
Jack

19
Dies ist jetzt pd.to_numeric (col) in neueren Versionen
Jeff

11
convert_objects ist in neueren Pandas veraltet. Verwenden Sie die datentypspezifischen Konverter pd.to_numeric.
Thomas Matthew

56

Sie können es versuchen df.column_name = df.column_name.astype(float). Für die NaNWerte müssen Sie angeben, wie sie konvertiert werden sollen, aber Sie können die .fillnaMethode verwenden, um dies zu tun.

Beispiel:

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])

47

In einer neueren Version von Pandas (ab 0.17) können Sie die Funktion to_numeric verwenden. Sie können den gesamten Datenrahmen oder nur einzelne Spalten konvertieren. Außerdem können Sie auswählen, wie Dinge behandelt werden sollen, die nicht in numerische Werte konvertiert werden können:

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')

32
Um sich pd.to_numericauf a zu bewerben DataFrame, kann man df.apply(pd.to_numeric)wie in dieser Antwort ausführlich erklärt verwenden .
Ninjakannon

30
df['MyColumnName'] = df['MyColumnName'].astype('float64') 

6
Dies funktioniert nicht beim Konvertieren von einem String in einen Float:ValueError: could not convert string to float: 'date'
Jack

@ Jack kennst du die Problemumgehung hier? Ich habe genau dieses Problem beim Konvertieren von Zeichenfolgen in Float.
Hatt

@Hatt Ich stehe vor dem gleichen Problem. Hast du die Lösung dafür gefunden?
Prakhar Jhudele

@ Jack Ich bin mir nicht sicher, aber Sie scheinen Datumsformat und Float zu verwechseln. # konvertiere in datetime df ['date'] = pd.to_datetime (df ['date'])
Claude COULOMBE

8

Sie müssen leere Zeichenfolgen ('') durch np.nan ersetzen, bevor Sie in float konvertieren. dh:

df['a']=df.a.replace('',np.nan).astype(float)

1

Hier ist ein Beispiel

                            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

aber wenn dies alles Zeichenfolgenwerte sind ... wie in meinem Fall ... Konvertieren Sie die gewünschten Spalten in Floats:

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)

Ihr Datenrahmen hat jetzt Float-Werte :-)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.