Konvertieren Sie Zahlenfolgen mit Kommas in Pandas DataFrame in Float

88

Ich habe einen DataFrame, der Zahlen als Zeichenfolgen mit Kommas für die Tausendermarkierung enthält. Ich muss sie in Schwimmer umwandeln.

a = [['1,200', '4,200'], ['7,000', '-0.03'], [ '5', '0']]
df=pandas.DataFrame(a)

Ich vermute, ich muss locale.atof verwenden. Tatsächlich

df[0].apply(locale.atof)

funktioniert wie erwartet. Ich bekomme eine Reihe von Schwimmern.

Wenn ich es jedoch auf den DataFrame anwende, wird eine Fehlermeldung angezeigt.

df.apply(locale.atof)

TypeError: ("Die Serie kann nicht konvertiert werden in", u'occored at index 0 ')

und

df[0:1].apply(locale.atof)

gibt einen weiteren Fehler:

ValueError: ('ungültiges Literal für float (): 1.200', aufgetreten bei Index 0 ')

Wie konvertiere ich diese DataFrameZeichenfolgen in einen DataFrame von Floats?

Pheon
quelle
2
Alte Frage, aber das OP erhält diesen Fehler, weil applyauf einem DataFrame eine ganze Spalte als Serie an die Funktion übergeben wird (in diesem Fall locale.atofwird eine Zeichenfolge erwartet). Wenn Sie die applymapMethode verwenden, die @AndyHayden in der folgenden Antwort verwendet, sollten Sie dies problemlos tun können.
TC Proctor

Antworten:

144

Wenn Sie von csv einlesen , können Sie das Tausenderargument verwenden :

df.read_csv('foo.tsv', sep='\t', thousands=',')

Diese Methode ist wahrscheinlich effizienter als die Durchführung der Operation als separater Schritt.


Sie müssen zuerst das Gebietsschema festlegen :

In [ 9]: import locale

In [10]: from locale import atof

In [11]: locale.setlocale(locale.LC_NUMERIC, '')
Out[11]: 'en_GB.UTF-8'

In [12]: df.applymap(atof)
Out[12]:
      0        1
0  1200  4200.00
1  7000    -0.03
2     5     0.00
Andy Hayden
quelle
Ich hätte sagen sollen, dass ich das Gebietsschema festgelegt habe. Ich bekomme immer noch den Fehler.
Pheon
2
Aber ich benutze df.read_fwf, und das hat auch die Option "tausend = ','", die funktioniert. Vielen Dank.
Pheon
Warum funktioniert df.applymap (atof) für Sie, aber nicht für mich? Mein Gebietsschema ist 'en_US.UTF-8'.
Pheon
10
Ich habe dies für den Argumenttipp 'Tausende' für die Funktion read_csv gestimmt. Das hat bei mir super geklappt.
Rockfakie
3
Ich wollte hinzufügen, dass Sie auch "decimal = ','" verwenden können, wenn Sie mit Floats arbeiten.
VessoVit
32

Sie können die Methode pandas.Series.str.replace verwenden:

df.iloc[:,:].str.replace(',', '').astype(float)

Diese Methode kann das Komma in der Zeichenfolge entfernen oder ersetzen.

Shen Ke
quelle
1
Ich erhalte "AttributeError: 'DataFrame' Objekt hat kein Attribut 'str'", keine Ahnung warum ...
krassowski
1
Aber das funktioniert:df.apply(lambda x: x.str.replace(',', '').astype(float), axis=1)
Krassowski
21

Sie können jeweils eine Spalte wie folgt konvertieren:

df['colname'] = df['colname'].str.replace(',', '').astype(float)
Ghollah Kioko
quelle