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