Конвертирование валюты с $в числа в Python pandas

У меня есть следующие данные в pandas dataframe:

state 1st 2nd 3rd
0 California $11,593,820 $109,264,246 $8,496,273
1 New York $10,861,680 $45,336,041 $6,317,300
2 Florida $7,942,848 $69,369,589 $4,697,244
3 Texas $7,536,817 $61,830,712 $5,736,941

Я хочу выполнить простой анализ (например, sum, groupby) с тремя столбцами (1-й, 2-й, 3-й), но тип данных этих трех столбцов - это объект (или строка).

Итак, я использовал следующий код для преобразования данных:

data = data.convert_objects(convert_numeric=True)

Но конверсия не работает, возможно, из-за знака доллара. Любое предложение?

3 ответа

Ответ

@EdChum умный и работает хорошо. Но так как есть более чем один способ испечь торт.... почему бы не использовать регулярное выражение? Например:

df[df.columns[1:]].replace('[\$,]', '', regex=True).astype(float)

Для меня это немного читаемо.


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

import locale
import pandas as pd
locale.setlocale(locale.LC_ALL,'')
df['1st']=df.1st.map(lambda x: locale.atof(x.strip('$')))

Обратите внимание, что приведенный выше код был протестирован в среде Python 3 и Windows


Вы можете использовать векторизованные методы str для замены нежелательных символов, а затем применить тип к int:

In [81]:
df[df.columns[1:]] = df[df.columns[1:]].apply(lambda x: x.str.replace('$','')).apply(lambda x: x.str.replace(',','')).astype(np.int64)
df
Out[81]:
 state 1st 2nd 3rd
index 
0 California 11593820 109264246 8496273
1 New York 10861680 45336041 6317300
2 Florida 7942848 69369589 4697244
3 Texas 7536817 61830712 5736941

dtype теперь подтверждено изменение:

In [82]:
df.info()
<class 'pandas.core.frame.dataframe'="">
Int64Index: 4 entries, 0 to 3
Data columns (total 4 columns):
state 4 non-null object
1st 4 non-null int64
2nd 4 non-null int64
3rd 4 non-null int64
dtypes: int64(3), object(1)
memory usage: 160.0+ bytes
</class>

Другой способ:

In [108]:
df[df.columns[1:]] = df[df.columns[1:]].apply(lambda x: x.str[1:].str.split(',').str.join('')).astype(np.int64)
df
Out[108]:
 state 1st 2nd 3rd
index 
0 California 11593820 109264246 8496273
1 New York 10861680 45336041 6317300
2 Florida 7942848 69369589 4697244
3 Texas 7536817 61830712 5736941

licensed under cc by-sa 3.0 with attribution.