Python-矢量化自定义函数而不是应用

Python-矢量化自定义函数而不是应用,python,pandas,vectorization,Python,Pandas,Vectorization,我有一个带有城市名称和日期的熊猫数据框,如下所示: 我还有另一个数据框,在给定的时间范围内匹配一个人和一个城市,它基本上表示这个人在开始日期和结束日期之间在这个城市 In[51]: db.head() Out[51]: CITY PERSON START END 0 PARIS ID4 2014-01-01 2017-03-16 1 NEW-YORK ID5 2014-01-07 2016-12-31 2 LOND

我有一个带有城市名称和日期的熊猫数据框,如下所示:

我还有另一个数据框,在给定的时间范围内匹配一个人和一个城市,它基本上表示这个人在开始日期和结束日期之间在这个城市

In[51]: db.head()
Out[51]: 
       CITY PERSON       START         END
0     PARIS    ID4  2014-01-01  2017-03-16
1  NEW-YORK    ID5  2014-01-07  2016-12-31
2    LONDON    ID1  2014-01-01  2016-05-08
3  MONTREAL    ID1  2016-05-09  2017-03-16
4     TOKYO    ID5  2017-01-01  2017-03-16
我想在df中添加一列,以确定在给定日期,给定城市中的每一行中的哪个人

我能够使用自定义函数myfunc实现它,我使用df.applylambda x:myfuncx['CITY'],x['DATE'],axis=1将该函数按行应用于df

myfunc仅在db中识别正确的人员,如下所示:

def myfunc(city, date):
    return db.loc[(db.CITY==city) & (db.START <= date) & (db.END >= date), 'PERSON'].values[0]
这工作得很好,但对于非常大的数据帧来说速度相当慢。。。我试图以某种方式将db数据合并到df中,或者至少实现一个矢量化版本,而不依赖于行实现。 有什么帮助吗

使用

df必须按“日期”排序 数据库必须先按“开始”排序,然后按“结束”排序 我们使用by参数仅按“城市”匹配 在末尾进行查询,以确保我们只获得“end”>=“DATE” 请注意,只有“PARIS”条目与您提供的数据匹配。

使用

df必须按“日期”排序 数据库必须先按“开始”排序,然后按“结束”排序 我们使用by参数仅按“城市”匹配 在末尾进行查询,以确保我们只获得“end”>=“DATE” 请注意,只有“PARIS”条目与您提供的数据匹配

def myfunc(city, date):
    return db.loc[(db.CITY==city) & (db.START <= date) & (db.END >= date), 'PERSON'].values[0]
pd.merge_asof(
    df.sort_values('DATE'),
    db.sort_values(['START', 'END']),
    left_on='DATE', right_on='START', by='CITY'
).query('DATE <= END')

    CITY       DATE PERSON      START        END
0  PARIS 2014-05-05    ID4 2014-01-01 2017-03-16
3  PARIS 2017-03-12    ID4 2014-01-01 2017-03-16