2016-08-06 3 views
2

Я работаю с массивом CSV с миллиметровой строкой, который включает в себя столбцы «широта» и «долгота», и я хочу создать новый столбец, основанный на том, что называется «состояние», которое является состоянием США, которое содержит эти координаты.Каков правильный способ использования .pply с пандами?

import pandas as pd 
import numpy as np 
import os 
from uszipcode import ZipcodeSearchEngine 

def convert_to_state(coord): 
    lat, lon = coord["latitude"], coord["longitude"] 
    res = search.by_coordinate(lat, lon, radius=1, returns=1) 
    state = res.State 
    return state 

def get_state(path): 
    with open(path + "USA_downloads.csv", 'r+') as f: 
     data = pd.read_csv(f) 
     data["state"] = data.loc[:, ["latitude", "longitude"]].apply(convert_to_state, axis=1) 

get_state(path) 

Я получаю сообщение об ошибке "DtypeWarning: Столбцах (4,5) смешал тип Укажите DTYPE опции импорта или установить low_memory = False.." Столбцы 4 и 5 соответствуют широте и долготе. Я не понимаю, как я буду использовать .apply для выполнения этой задачи, или если .apply - даже правильный метод для работы. Как мне продолжить?

ответ

3

Я считаю, что это будет быстрее, реализация вашей программы:

import pandas as pd 
import numpy as np 
import os 
from uszipcode import ZipcodeSearchEngine 

def convert_to_state(lat, lon): 
    lat, lon = round(lat, 7), round(lon, 7) 
    res = search.by_coordinate(lat, lon, radius=1, returns=1) 
    state = res.State 
    return state 

def get_state(path): 
    with open(path + "USA_downloads.csv", 'r+') as f: 
     data = pd.read_csv(f) 
     data["state"] = np.vectorize(convert_to_state)(data["latitude"].values, data["longitude"].values) 

get_state(path) 

Он использует numpy.vectorize ускорить вещи немного (хотя это все еще цикл), а затем вызывает функцию со значениями, полученными из столбцов 'latitude' и 'longitude' вашего DataFrame, преобразованного в numpy.ndarray (это делает атрибут .values).


Если вы хотите продолжать использовать .apply(), вы можете сделать:

state = data.apply(lambda x: convert_to_state(x['latitude'], x['longitude']), axis=1) 
data["state"] = state 

Редактировать

Чтобы избежать uszipcode от поднимая TypeError, используйте:

def convert_to_state(lat, lon): 
    try: 
     res = search.by_coordinate(lat, lon, radius=1, returns=1) 
     state = res.State 
    except TypeError as TE: 
     state = None 
    return state 

Если вы хотите продолжить отладку uszipcode и причину возникновения ошибки, я рекомендую вам задать другой вопрос с соответствующими тегами, и кто-то вам поможет. У меня нет опыта работы с этим пакетом, поэтому я, возможно, не очень помогу.

+0

Ты лучший. Большое спасибо за ваше объяснение! Это фантастика! – user1917407

+1

@ пользователь1917407, спасибо! Рад, что смог помочь. – Kartik

+0

Позвольте мне сделать дополнение к этому на самом деле. После некоторых упражнений я все еще сталкиваюсь с некоторыми проблемами, хотя я не уверен, что это связано с той же проблемой, что и раньше. Я вижу, что значение широты в журнале ошибок здесь намного больше, чем широта: однако эта аномалия полностью отсутствует в файле CSV. Любые идеи относительно того, что может вызвать эту проблему? http://pastebin.com/HZeZGNf2 – user1917407

Смежные вопросы