使用.apply与pandas的正确方法是什么?

时间:2016-08-06 01:26:27

标签: python pandas

我正在使用包含“纬度”和“经度”列的百万行CSV数据集,我想创建一个基于名为“state”的新列,这是包含这些坐标的美国州

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:Columns(4,5)有混合类型。在导入时指定dtype选项或设置low_memory = False。”第4列和第5列对应于纬度和经度。我不明白我将如何使用.apply来完成这项任务,或者.apply甚至是正确的工作方法。我该怎么办?

1 个答案:

答案 0 :(得分: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,以及导致错误的原因,我建议您使用相应的标签提出另一个问题,并且有人会帮助您。我没有这方面的经验,所以我可能没什么帮助。