У меня есть 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 с плавающей запятой?
apply
в DataFrame весь столбец передается функции в виде серии (в данном случаеlocale.atof
, которая ожидает строку). Если вы используетеapplymap
метод, который @AndyHayden использует в ответе ниже, у вас все должно получиться нормально.Ответы:
Если вы читаете из 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
источник
Вы можете использовать метод pandas.Series.str.replace :
df.iloc[:,:].str.replace(',', '').astype(float)
Этот метод может удалить или заменить запятую в строке.
источник
df.apply(lambda x: x.str.replace(',', '').astype(float), axis=1)
Вы можете преобразовать один столбец за раз следующим образом:
df['colname'] = df['colname'].str.replace(',', '').astype(float)
источник