首页 > 解决方案 > 表查找循环的矢量化实现已解决

问题描述

我有两个熊猫数据框,df_map 有我正在使用的数据,df_4pc 是一个查找表。我想通过使用邮政编码在我的 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,但我得到了一个 keyrror:

>> df_4pc.lookup(df_map["location_postcode"], ["postcode"]*len(df_map))

KeyError: 'One or more row labels was not found'

但是,我确保在 df_map 中仅使用 df_4pc 中存在的邮政编码(其他值被丢弃)。我有一个正在运行的实现,但是数据集非常大,使用我的循环实现运行整个过程需要几个小时:

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 相关的线程,但我找不到任何对我有用的东西。

最后一个问题是:我怎样才能得到这个查找表的有效实现?

解决方案 pandas join 在一秒钟内为 +1M 行的数据库完成了这项工作。

coords = df_4pc.set_index('postcode')
df_map = df_map.loc[:, ['location_postcode'].copy()].join(coords, on='location_postcode')

标签: pythonpandaslookup

解决方案


您尚未将数据作为MVCE提供,因此我无法验证,但DataFrame.join应该可以工作。

coords = df_4pc.set_index('postcode')
df_map = (df_map.loc[:, ['location_postcode'].copy()
          .join(coords, on='location_postcode'))

推荐阅读