- 在
crq_data
文件中,我有来自用户上传的*.csv文件的城市和州 - 在
cityDoordinates.csv
文件中,我有一个美国城市和州的图书馆及其坐标,我希望这是一种"查找工具"。在Folium 中比较上传的csv文件以找到它们的坐标。
现在,它逐行读取,所以它每次附加一个坐标(n秒)我希望它运行得更快,这样如果有6000行,用户就不必等待6000秒了。
下面是我的部分代码:
crq_file = askopenfilename(filetypes=[('CSV Files', '*csv')])
crq_data = pd.read_csv(crq_file, encoding="utf8")
coords = pd.read_csv("cityCoordinates.csv")
for crq in range(len(crq_data)):
task_city = crq_data.iloc[crq]["TaskCity"]
task_state = crq_data.iloc[crq]["TaskState"]
for coordinates in range(len(coords)):
cityCoord = coords.iloc[coordinates]["City"]
stateCoord = coords.iloc[coordinates]["State"]
latCoord = coords.iloc[coordinates]["Latitude"]
lngCoord = coords.iloc[coordinates]["Longitude"]
if task_city == cityCoord and task_state == stateCoord:
crq_data["CRQ Latitude"] = latCoord
crq_data["CRQ Longitude"] = lngCoord
print(cityCoord, stateCoord, latCoord, lngCoord)
这是当前终端输出
的一个示例上传。csv文件示例
我认为这不是优化Pandas的问题,而是为快速查找找到一个好的数据结构:而快速查找的一个好的数据结构就是字典。不过,字典占用内存;你需要自己评估成本。
我模拟了你的cityCoordinates CSV的样子:
| City | State | Latitude | Longitude |
|----------|-------|------------|-------------|
| Portland | OR | 45°31′12″N | 122°40′55″W |
| Dallas | TX | 32°46′45″N | 96°48′32″W |
| Portland | ME | 43°39′36″N | 70°15′18″W |
import csv
import pprint
def cs_key(city_name: str, state_name: str) -> str:
"""Make a normalized City-State key."""
return city_name.strip().lower() + "--" + state_name.strip().lower()
# A dict of { "City_name-State_name": (latitude, longitude), ... }
coords_lookup = {}
with open("cityCoordinates.csv", newline="") as f:
reader = csv.DictReader(f) # your coords file appears to have a header
for row in reader:
city = row["City"]
state = row["State"]
lat = row["Latitude"]
lon = row["Longitude"]
key = cs_key(city, state)
coords_lookup[key] = (lat, lon)
pprint.pprint(coords_lookup, sort_dicts=False)
当我运行它时,我得到:
{'portland--or': ('45°31′12″N', '122°40′55″W'),
'dallas--tx': ('32°46′45″N', '96°48′32″W'),
'portland--me': ('43°39′36″N', '70°15′18″W')}
现在,迭代任务数据看起来几乎相同:我们取一对City和State,从中生成一个标准化键,然后尝试查找已知坐标的键。
我模拟了一些任务数据:
| TaskCity | TaskState |
|------------|-----------|
| Portland | OR |
| Fort Worth | TX |
| Dallas | TX |
| Boston | MA |
| Portland | ME |
,当我运行这个时:
with open("crq_data.csv", newline="") as f:
reader = csv.DictReader(f)
for row in reader:
city = row["TaskCity"]
state = row["TaskState"]
key = cs_key(city, state)
coords = coords_lookup.get(key, (None, None))
if coords != (None, None):
print(city, state, coords[0], coords[1])
我:
Portland OR 45°31′12″N 122°40′55″W
Dallas TX 32°46′45″N 96°48′32″W
Portland ME 43°39′36″N 70°15′18″W
这个解决方案在原则上要快得多,因为你没有做一个cityCoordinates-ROWS x taskData-ROWS
二次循环。而且,在实践中,Pandas在执行行迭代^1时受到影响,我不确定索引(iloc
)是否同样适用,但通常Pandas用于操作数据的列,我想说不是面向行的问题/解决方案。