Mam DataFrame, która zawiera liczby jako ciągi z przecinkami dla znacznika tysięcy. Muszę je przekonwertować na pływaki.
a = [['1,200', '4,200'], ['7,000', '-0.03'], [ '5', '0']]
df=pandas.DataFrame(a)
Zgaduję, że muszę użyć locale.atof. W rzeczy samej
df[0].apply(locale.atof)
działa zgodnie z oczekiwaniami. Dostaję serię pływaków.
Ale kiedy stosuję go do ramki DataFrame, pojawia się błąd.
df.apply(locale.atof)
TypeError: ("nie można przekonwertować serii na", wystąpiło u'przy indeksie 0 ')
i
df[0:1].apply(locale.atof)
daje inny błąd:
ValueError: ('nieprawidłowy literał dla float (): 1,200', u'wystąpił w indeksie 0 ')
Jak więc przekonwertować to DataFrame
z ciągów na DataFrame elementów zmiennoprzecinkowych?
apply
w DataFrame przekazuje całą kolumnę do funkcji jako serię (w tym przypadkulocale.atof
, który oczekuje ciągu). Jeśli użyjeszapplymap
metody, którą @AndyHayden wykonuje w odpowiedzi poniżej, powinieneś być w stanie to zrobić dobrze.Odpowiedzi:
Jeśli czytasz z csv , możesz użyć argumentu tysięcy :
df.read_csv('foo.tsv', sep='\t', thousands=',')
Ta metoda może być bardziej wydajna niż wykonywanie tej operacji jako oddzielnego kroku.
Najpierw musisz ustawić ustawienia regionalne :
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
źródło
Możesz użyć metody pandas.Series.str.replace :
df.iloc[:,:].str.replace(',', '').astype(float)
Ta metoda może usunąć lub zamienić przecinek w ciągu.
źródło
df.apply(lambda x: x.str.replace(',', '').astype(float), axis=1)
Możesz przekonwertować jedną kolumnę na raz w ten sposób:
df['colname'] = df['colname'].str.replace(',', '').astype(float)
źródło