2013-05-24 3 views
54

Wie Sie eine DataFrame-Spalte, die Zeichenfolgen und NaN-Werte enthält, in Floats konvertieren. Und es gibt eine andere Spalte, deren Werte Strings und Floats sind; wie man diese ganze Spalte in Floats umwandelt.Umwandeln von Zeichenfolgen in Gleitkommazahlen in einem Datenrahmen

+2

NICHT VERWENDEN ** 'convert_objects' **. Es ist veraltet. Verwenden Sie 'to_numeric' oder' astype' stattdessen –

Antwort

28

Sie können versuchen df.column_name = df.column_name.astype(float). Wie für die NaN Werte müssen Sie angeben, wie sie konvertiert werden sollen, aber Sie können die .fillna Methode dazu verwenden.

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

Dies ist in 0.11 verfügbar. Forces conversion (oder set's to nan) Dies funktioniert auch, wenn astype fehlschlägt; seine auch Serie von Serie so wird es keine vollständige String-Spalte

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 
+0

Bitte beachten Sie, dass dies nicht für Spalten (am führenden Multiindex) funktioniert, funktioniert nur für Werte im Datenrahmen – denfromufa

+1

Ich musste set_levels verwenden, um Zeichenfolge in float – denfromufa

+0

zu konvertieren, dann machst du etwas falsch . das Konvertieren von String in Float ist eine explizite Benutzeraktion. – Jeff

15
df['MyColumnName'] = df['MyColumnName'].astype('float64') 
+2

Dies funktioniert nicht beim Konvertieren von einem String in einen Float: 'ValueError: konnte String nicht in float: 'Datum konvertieren '' – Jack

27

In einer neueren Version von Pandas (0,17 und höher) sagen konvertieren, Sie to_numeric Funktion nutzen zu können. Es ermöglicht Ihnen, den gesamten Datenrahmen oder nur einzelne Spalten zu konvertieren. Es gibt Ihnen auch die Möglichkeit zu wählen, wie Sie Dinge behandeln, die nicht in numerische Werte umgewandelt 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') 
+15

Um' pd.to_numeric' auf einen 'DataFrame' anzuwenden, kann man' df.apply (pd.to_numeric) 'als [ausführlich in dieser Antwort erklärt] (https://stackoverflow.com/a/34844867) verwenden/604687). – Ninjakannon

Verwandte Themen