2016-07-24 4 views
0

Я пытаюсь прочитать файл csv. в одном столбце (hpi), который должен быть float32, есть две записи, заполненные a. для указания отсутствующих значений. Панда интерпретирует. как персонаж.pandas read_csv конвертировать объект в float

Как сделать числовое число в этой колонке?

data = pd.read_csv('http://www.fhfa.gov/DataTools/Downloads/Documents/HPI/HPI_AT_state.csv', 
        header=0, 
        names = ["state", "year", "qtr", "hpi"]) 

        #,converters={'hpi': float}) 

#print data.head() 
#print(data.dtypes) 

print(data[data.hpi == '.']) 
+0

напишите свой код читаемым способом (объедините весь фрагмент кода с апострофами). Для этого вы можете отредактировать исходное сообщение. – danielhadar

+0

Спасибо за редактирование. Было бы хорошо, что у вас было бы числовое значение вместо «.»? (_e._ -1, 999 и т. д.) – danielhadar

+0

да, но поле имеет десятичные знаки. 0 AK 1975 2 63,40 1 AK 1975 3 66,60 2 AK 1975 4 67,91 3 AK 1976 1 70,45 4 AK 1976 2 71,83 состояние год четв HPI 7593 VT 1976 1. 8112 WV 1982 1. >>> – user3529091

ответ

1

Используйте na.values параметр в read.csv:

df = pd.read_csv('http://www.fhfa.gov/DataTools/Downloads/Documents/HPI/HPI_AT_state.csv', 
        header=0, 
        names = ["state", "year", "qtr", "hpi"], 
        na_values='.') 

df.dtypes 
Out: 
state  object 
year  int64 
qtr  int64 
hpi  float64 
dtype: object 
0

Вы можете просто бросить это после того, как прочитаете его.

data.loc[data.hpi == '.', 'hpi'] = pd.np.nan 
data.hpi = data.hpi.astype(pd.np.float64) 

В качестве альтернативы вы можете использовать параметр na_values для read_csv

+1

это единственный способ сделать это? нет способа сделать это, когда он правильно его прочитает? – user3529091

+0

Нет, вы также можете использовать 'read_csv', что, вероятно, лучший способ в этом сценарии. В зависимости от того, сколько после обработки вы делаете после чтения данных, хотя/если вы не хотите читать через docstrings, чтобы помнить имя ключа/пары, я иногда считаю это проще. – mgilbert

0

Нанести to_numeric на нужную колонку (с apply):

data.loc[data.hpi == '.', 'hpi'] = -1.0 
data[['hpi']] = data[['hpi']].apply(pd.to_numeric) 

Например:

In[69]: data = pd.read_csv('http://www.fhfa.gov/DataTools/Downloads/Documents/HPI/HPI_AT_state.csv', 
        header=0, 
        names = ["state", "year", "qtr", "hpi"]) 

In[70]: data[['hpi']].dtypes 
    Out[70]: 
    hpi object 
    dtype: object 

In[74]: data.loc[data.hpi == '.'] = -1.0 
In[75]: data[['hpi']] = data[['hpi']].apply(pd.to_numeric) 

In[77]: data[['hpi']].dtypes 
Out[77]: 
hpi float64 
dtype: object 

EDIT:

почему-то меняет все столбцы float64. Это небольшое обходное решение, которое изменяет их на int.

До:

In[89]: data.dtypes 
Out[89]: 
state  object 
year  float64 
qtr  float64 
hpi  float64 

После:

In[90]: data[['year','qtr']] = data[['year','qtr']].astype(int) 
In[91]: data.dtypes 
Out[91]: 
state  object 
year  int64 
qtr  int64 
hpi  float64 
dtype: object 

Если кто-то может пролить свет на пути случается, что было бы здорово.

+0

спасибо, оцените помощь. но он изменил тип данных на всех числовых столбцах на float64. есть ли способ изолировать его только от столбца hpi? – user3529091

+0

Вы правы, это довольно странно. Не удалось решить это изящно, но я добавил (под ** EDIT **) обходной путь. – danielhadar

+0

Кстати, вы можете использовать 'astype (float)' вместо 'apply (pd.to_numeric)'. – danielhadar