Преобразование числовых строк с запятыми в pandas DataFrame в float

88

У меня есть 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 (): 1,200', 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
Энди Хайден
источник
Я должен был сказать, что установил регион. Я все еще получаю сообщение об ошибке.
pheon 03
2
Но я использую df.read_fwf, и у него тоже есть опция "тысяча = ','", которая работает. Спасибо.
pheon 03
Опять же, почему df.applymap (atof) работает на вас, а не на меня? Моя локаль - en_US.UTF-8.
pheon 03
10
Я проголосовал за аргумент «тысячи» для функции read_csv. Это отлично сработало для меня.
rockfakie
3
Я хотел добавить, что вы также можете использовать decimal = ',' ", если имеете дело с числами с плавающей запятой.
VessoVit
32

Вы можете использовать метод pandas.Series.str.replace :

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

Этот метод может удалить или заменить запятую в строке.

шен ке
источник
1
Я получаю «AttributeError: объект 'DataFrame' не имеет атрибута 'str'», не знаю, почему ...
Крассовский
1
Но это работает:df.apply(lambda x: x.str.replace(',', '').astype(float), axis=1)
krassowski
21

Вы можете преобразовать один столбец за раз следующим образом:

df['colname'] = df['colname'].str.replace(',', '').astype(float)
голла киоко
источник