table 查找循环的向量化实现已解决
Vectorized implementation of a table lookup loop SOLVED
我有两个 pandas 数据帧,df_map 有我正在使用的数据,df_4pc 是一个查找 table。我想通过使用邮政编码在我的 df_map 中包含纬度和经度。
他们看起来是这样的:
>> df_4pc.head()
idx postcode woonplaats latitude longitude
0 1000 Amsterdam 52.336243 4.869444
1 1001 Amsterdam 52.364240 4.883358
2 1002 Amsterdam 52.364240 4.883358
3 1003 Amsterdam 52.364240 4.883358
4 1005 Amsterdam 52.364240 4.883358
>> df_map.head()
location_postcode latitude longitude
visit_id
12765996 1000 0.0 0.0
12764909 1005 0.0 0.0
11698683 1002 0.0 0.0
11665112 1003 0.0 0.0
12638508 1005 0.0 0.0
对于这个任务,我尝试使用 df.lookup,但我得到了一个错误:
>> df_4pc.lookup(df_map["location_postcode"], ["postcode"]*len(df_map))
KeyError: 'One or more row labels was not found'
但是,我确保在 df_map 中只使用 df_4pc 中存在的邮政编码(其他值被丢弃)。我有一个实现 运行ning,但是数据集非常大,我的循环实现需要几个小时 运行 整个过程:
for i in tqdm_notebook(df_map.index.tolist()):
df_map.at[i, "latitude"] = df_4pc[df_4pc["postcode"] == df_map.at[i, "location_postcode"]]["latitude"]
df_map.at[i, "longitude"] = df_4pc[df_4pc["postcode"] == df_map.at[i, "location_postcode"]]["longitude"]
这是我的预期输出:
>> df_map.head()
location_postcode latitude longitude
visit_id
12765996 1000 52.336243 4.869444
12764909 1005 52.364240 4.883358
11698683 1002 52.364240 4.883358
11665112 1003 52.364240 4.883358
12638508 1005 52.364240 4.883358
我很不明白为什么我会出现这个关键错误。我查看了堆栈溢出的多个线程,尤其是与 df.lookup 相关的线程,但我找不到任何对我有用的线程。
最后一个问题是:我怎样才能有效地实现这个查找 table?
解决方案
pandas join 在一秒钟内为 +1M 行的数据库完成工作。
coords = df_4pc.set_index('postcode')
df_map = df_map.loc[:, ['location_postcode'].copy()].join(coords, on='location_postcode')
您没有提供您的数据,因为 MVCE so I can't verify but DataFrame.join 应该有效。
coords = df_4pc.set_index('postcode')
df_map = (df_map.loc[:, ['location_postcode'].copy()
.join(coords, on='location_postcode'))
我有两个 pandas 数据帧,df_map 有我正在使用的数据,df_4pc 是一个查找 table。我想通过使用邮政编码在我的 df_map 中包含纬度和经度。
他们看起来是这样的:
>> df_4pc.head()
idx postcode woonplaats latitude longitude
0 1000 Amsterdam 52.336243 4.869444
1 1001 Amsterdam 52.364240 4.883358
2 1002 Amsterdam 52.364240 4.883358
3 1003 Amsterdam 52.364240 4.883358
4 1005 Amsterdam 52.364240 4.883358
>> df_map.head()
location_postcode latitude longitude
visit_id
12765996 1000 0.0 0.0
12764909 1005 0.0 0.0
11698683 1002 0.0 0.0
11665112 1003 0.0 0.0
12638508 1005 0.0 0.0
对于这个任务,我尝试使用 df.lookup,但我得到了一个错误:
>> df_4pc.lookup(df_map["location_postcode"], ["postcode"]*len(df_map))
KeyError: 'One or more row labels was not found'
但是,我确保在 df_map 中只使用 df_4pc 中存在的邮政编码(其他值被丢弃)。我有一个实现 运行ning,但是数据集非常大,我的循环实现需要几个小时 运行 整个过程:
for i in tqdm_notebook(df_map.index.tolist()):
df_map.at[i, "latitude"] = df_4pc[df_4pc["postcode"] == df_map.at[i, "location_postcode"]]["latitude"]
df_map.at[i, "longitude"] = df_4pc[df_4pc["postcode"] == df_map.at[i, "location_postcode"]]["longitude"]
这是我的预期输出:
>> df_map.head()
location_postcode latitude longitude
visit_id
12765996 1000 52.336243 4.869444
12764909 1005 52.364240 4.883358
11698683 1002 52.364240 4.883358
11665112 1003 52.364240 4.883358
12638508 1005 52.364240 4.883358
我很不明白为什么我会出现这个关键错误。我查看了堆栈溢出的多个线程,尤其是与 df.lookup 相关的线程,但我找不到任何对我有用的线程。
最后一个问题是:我怎样才能有效地实现这个查找 table?
解决方案 pandas join 在一秒钟内为 +1M 行的数据库完成工作。
coords = df_4pc.set_index('postcode')
df_map = df_map.loc[:, ['location_postcode'].copy()].join(coords, on='location_postcode')
您没有提供您的数据,因为 MVCE so I can't verify but DataFrame.join 应该有效。
coords = df_4pc.set_index('postcode')
df_map = (df_map.loc[:, ['location_postcode'].copy()
.join(coords, on='location_postcode'))