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.

Neer
quelle
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
Jeff
quelle
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])
Wurzel
quelle
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')
Salvador Dali
quelle
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') 
Claude COULOMBE
quelle
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)
Paul Mwaniki
quelle
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 :-)

ArmandduPlessis
quelle