我正在使用包含“纬度”和“经度”列的百万行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甚至是正确的工作方法。我该怎么办?
答案 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
,以及导致错误的原因,我建议您使用相应的标签提出另一个问题,并且有人会帮助您。我没有这方面的经验,所以我可能没什么帮助。