一种快速方法,可从一个数据帧中的另一个数据帧中查找元素并返回其索引

卡尔菲利普

简而言之,我正在尝试比较第一列的2列DataFrame与另一个列中的相同列的值DataFrame匹配的行的索引在first中存储为新列DataFrame

让我解释一下:我正在使用地理特征(纬度/经度),并且主要对象DataFrame(称为df)具有约55M观测值,看起来有点像这样:

在此处输入图片说明

如您所见,只有两行数据看起来合法(索引2和4)。

第二个DataFrame(称为)legit_df要小得多,并且拥有我认为合法的所有地理数据:

在此处输入图片说明

无需研究WHY,主要任务涉及将每次经纬度观测值与df的数据进行比较legit_df匹配成功后,会将的索引legit_df复制到的新列中df,结果df如下所示:

在此处输入图片说明

该值-1用于显示没有成功匹配的时间。在上面的示例中,唯一有效的观测值是索引2和4的观测值,它们在中的索引1和2处找到了匹配项legit_df

我当前解决此问题的方法使用.apply()是的,它很慢,但是我找不到一种方法来对下面的函数进行矢量化或使用Cython对其进行加速:

def getLegitLocationIndex(lat, long):
    idx = legit_df.index[(legit_df['pickup_latitude'] == lat) & (legit_df['pickup_longitude'] == long)].tolist()
    if (not idx):
        return -1
    return idx[0]

df['legit']  = df.apply(lambda row: getLegitLocationIndex(row['pickup_latitude'], row['pickup_longitude']), axis=1)

由于此代码在DataFrame具有55M观测值的情况下非常慢,因此我的问题是:有没有更快的方法来解决此问题?

我正在分享一个简短,自包含,正确(可编译)的示例,帮助您提出更快速的选择:

import pandas as pd
import numpy as np

data1 = { 'pickup_latitude'  : [41.366138,   40.190564,  40.769413],
          'pickup_longitude' : [-73.137393, -74.689831, -73.863300]
        }

legit_df = pd.DataFrame(data1)
display(legit_df)

####################################################################################

observations = 10000
lat_numbers = [41.366138,   40.190564,  40.769413, 10, 20, 30, 50, 60, 80, 90, 100]
lon_numbers = [-73.137393, -74.689831, -73.863300, 11, 21, 31, 51, 61, 81, 91, 101]

# Generate 10000 random integers between 0 and 10
random_idx = np.random.randint(low=0, high=len(lat_numbers)-1, size=observations)
lat_data = []
lon_data = []

# Create a Dataframe to store 10000 pairs of geographical coordinates
for i in range(observations):
    lat_data.append(lat_numbers[random_idx[i]])
    lon_data.append(lon_numbers[random_idx[i]])

df = pd.DataFrame({ 'pickup_latitude' : lat_data, 'pickup_longitude': lon_data })
display(df.head())

####################################################################################

def getLegitLocationIndex(lat, long):
    idx = legit_df.index[(legit_df['pickup_latitude'] == lat) & (legit_df['pickup_longitude'] == long)].tolist()
    if (not idx):
        return -1
    return idx[0]


df['legit']  = df.apply(lambda row: getLegitLocationIndex(row['pickup_latitude'], row['pickup_longitude']), axis=1)
display(df.head())

上面的示例df仅用10k进行创建observations在我的机器上运行大约需要7秒。如果使用100k observations,则需要约67秒才能运行。现在想象一下当我必须处理5500万行时的痛苦...

斯文·哈里斯(Sven Harris)

我认为您可以使用合并而不是当前逻辑来显着加快此速度:

full_df = df.merge(legit_df.reset_index(), how="left", on=["pickup_longitude", "pickup_latitude"])

这将重置参考表的索引以使其成为列并按经度连接

full_df = full_df.rename(index = str, columns={"index":"legit"})
full_df["legit"] = full_df["legit"].fillna(-1).astype(int)

这将重命名为您想要的列名称,并使用-1填充连接列中的所有缺失项

基准测试:

旧方法: 5.18 s ± 171 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

新的方法: 23.2 ms ± 1.3 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在一个数据帧中查找与另一个数据帧最近的索引

从另一个数据帧中查找元素以在 Python 中创建多索引数据帧

从一个数据帧中选择行,其中两个元素在另一个数据帧的一行中匹配

如何在另一个数据帧中查找一个数据帧的行?

查找具有存储在另一个数据帧中的值的数据帧

如何根据另一个数据帧中的行条件对一个数据帧的行索引进行矢量化查找

查找与另一个数据帧比较的数据帧的索引

从另一个数据帧中的一个数据帧中查找所有出现的值的最佳方法是什么?

关联两个数据帧与另一个数组中的元素相等的索引

使用PySpark数据帧时,根据索引从一个数组中定位值,然后复制到另一个数组中

另一个数据帧更新数据帧的最后一个元素

检查一个数据帧中的行是否在另一个数据帧中

在熊猫中从一个数据帧到另一个数据帧的每一行迭代差异

查找一个数据帧中的一行出现在R中的另一个数据帧中的时间

有没有一种方法可以过滤一个数据帧以将与另一个数据帧中的值匹配的值保留?

从一个数据帧到另一个数据帧的数据表操作

在 R 中,每隔 n 个值从一个数据帧插入到另一个数据帧

根据R中的两个匹配条件,将值从一个数据帧添加到另一个数据帧

基于另一个数据帧从一个数据帧中的序列中删除字符串

根据 Pandas Python 中另一个数据帧的条件从一个数据帧中删除行

将一个数据帧切片到另一个数据帧中

根据 Pandas 中的查找值从另一个数据帧中获取值

将数据从一个数据帧拖入另一个

按时间间隔从一个数据帧聚合另一个数据帧

如何计算从一个数据帧到另一个数据帧的单词?

将值从一个数据帧添加到R中的另一个数据帧

将 bin 限制从一个数据帧应用到 R 中的另一个数据帧

根据另一个数据帧的“时间戳”和“id”从一个数据帧中获取最大数量

从另一个数据帧映射后如何查找列中的值总和?