Перетворіть числові рядки з комами в пандах DataFrame у плаваючі


89

У мене є DataFrame, який містить числа у вигляді рядків із комами для маркера тисяч. Мені потрібно перетворити їх на плаваючі.

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

Я здогадуюсь, що мені потрібно використовувати locale.atof. Справді

df[0].apply(locale.atof)

працює, як очікувалося. Я отримую серію поплавців.

Але коли я застосовую його до DataFrame, я отримую помилку.

df.apply(locale.atof)

TypeError: ("не вдається перетворити серію в", u'виник за індексом 0 ')

і

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

видає чергову помилку:

ValueError: ('недійсний літерал для float (): 1200', u'виник в індексі 0 ')

Отже, як мені перетворити ці DataFrameрядки на DataFrame з поплавками?


2
Старе питання, але OP отримує цю помилку, оскільки applyна DataFrame передає цілий стовпець функції як серію (у цьому випадку locale.atof, яка очікує рядок). Якщо ви використовуєте applymapметод, який робить @AndyHayden у відповіді нижче, ви зможете це зробити чудово.
TC Proctor

Відповіді:


144

Якщо ви читаєте з csv, ви можете використовувати тисячі аргументів :

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

Цей метод, швидше за все, буде більш ефективним, ніж виконання операції як окремого кроку.


Спочатку потрібно встановити локаль :

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

Я повинен був сказати, що я встановив локаль. Я все ще отримую помилку.
феон 03.03.14

2
Але я використовую df.read_fwf, і у нього також є опція "тисячі = ','", яка працює. Дякую.
феон 03.03.14

Знову ж таки, чому df.applymap (atof) працює на вас, а не на мене? Мій регіон - 'en_US.UTF-8'.
феон 03.03.14

10
Я проголосував за підказку аргументу "тисячі" для функції read_csv. Для мене це чудово працювало.
rockfakie

3
Я хотів додати, що ви також можете використовувати "decimal = ','", якщо ви маєте справу з поплавками.
VessoVit

32

Ви можете використовувати метод pandas.Series.str.replace :

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

Цей метод може видалити або замінити кому у рядку.


1
Я отримую "AttributeError: об'єкт 'DataFrame' не має атрибута 'str'", не знаю, чому ...
krassowski

1
Але це працює:df.apply(lambda x: x.str.replace(',', '').astype(float), axis=1)
krassowski

22

Ви можете конвертувати один стовпець за раз, як це:

df['colname'] = df['colname'].str.replace(',', '').astype(float)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.