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 DataFrame
Zeichenfolgen in einen DataFrame von Floats?
apply
auf einem DataFrame eine ganze Spalte als Serie an die Funktion übergeben wird (in diesem Falllocale.atof
wird eine Zeichenfolge erwartet). Wenn Sie dieapplymap
Methode verwenden, die @AndyHayden in der folgenden Antwort verwendet, sollten Sie dies problemlos tun können.Antworten:
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
quelle
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.
quelle
df.apply(lambda x: x.str.replace(',', '').astype(float), axis=1)
Sie können jeweils eine Spalte wie folgt konvertieren:
df['colname'] = df['colname'].str.replace(',', '').astype(float)
quelle