Konwertuj ciągi liczbowe przecinkami w pandach DataFrame na zmiennoprzecinkowe

88

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 DataFramez ciągów na DataFrame elementów zmiennoprzecinkowych?

pheon
źródło
2
Stare pytanie, ale OP otrzymuje ten błąd, ponieważ applyw DataFrame przekazuje całą kolumnę do funkcji jako serię (w tym przypadku locale.atof, który oczekuje ciągu). Jeśli użyjesz applymapmetody, którą @AndyHayden wykonuje w odpowiedzi poniżej, powinieneś być w stanie to zrobić dobrze.
TC Proctor,

Odpowiedzi:

144

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
Andy Hayden
źródło
Powinienem był powiedzieć, że ustawiłem lokalizację. Nadal otrzymuję błąd.
pheon
2
Ale używam df.read_fwf, i to ma również opcję "tysiące = ','", która działa. Dzięki.
pheon
Z drugiej strony, dlaczego df.applymap (atof) działa dla Ciebie, a nie dla mnie? Moje ustawienia regionalne to „en_US.UTF-8”.
pheon
10
Zagłosowałem za wskazówką dotyczącą argumentów „tysiące” dla funkcji read_csv. To działało świetnie dla mnie.
rockfakie
3
Chciałem dodać, że możesz również użyć „decimal = ','”, jeśli masz do czynienia z liczbami zmiennoprzecinkowymi.
VessoVit
32

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.

shen ke
źródło
1
Otrzymuję „AttributeError: obiekt 'DataFrame' nie ma atrybutu 'str'”, nie mam pojęcia dlaczego ...
krassowski
1
Ale to działa:df.apply(lambda x: x.str.replace(',', '').astype(float), axis=1)
krassowski
21

Możesz przekonwertować jedną kolumnę na raz w ten sposób:

df['colname'] = df['colname'].str.replace(',', '').astype(float)
ghollah kioko
źródło