首页 > 解决方案 > 根据来自另一个 DataFrame 的标准过滤 Pandas 中的 DataFrame

问题描述

我有两个数据框,一个有数百万行数据,另一个只有几百条记录,我需要从第二个开始按三列过滤第一个数据框。

所以基本上我需要遍历 df2 中的每一行,看看 df1 中是否有任何行在开始日期和结束日期之间具有相同的代码和日期。可悲的是,我不知道如何使用 python 执行此操作。

所以我的数据框类似于以下

     Ticker    date
1    AA       2013-12-31 
3    AA       2015-02-28 
4    AA       2016-03-31 
5    AA       2016-04-30 
6    BB       2014-05-31 
7    BB       2014-06-30 
8    BB       2017-07-31 
9    CC       2014-08-31 
10   CC       2017-09-30 
11   CC       2018-10-31 
12   CC       2018-11-30 
13   DD       2018-11-30 
14   DD       2018-12-21

第二个:

     Ticker    StartDate   EndDate
1    AA       2016-01-01   2017-01-01
2    BB       2014-01-01   2015-01-01
3    CC       2018-01-01   2019-01-01
4    AA       2013-01-01   2014-01-01

我的预期结果是过滤第一个数据帧,其中包含开始日期和结束日期之间 df2 中所有代码的所有记录:

   Ticker     date
1    AA       2013-12-31  
2    AA       2016-03-31 
3    AA       2016-04-30 
4    BB       2014-05-31 
5    BB       2014-06-30  
6    CC       2018-11-30 

UPD

所以我尝试了以下方法:

df4 = pd.DataFrame()
###create empty dataframe
for index, row in df2.iterrows():
    df3 =df1.loc[(df1['DATE']>=row['StartDate'])&(df1['DATE']<=row['EndDate'])&(df1['Ticker'] ==row['Ticker'])]
###Go through rows of dataframe2, for every row i look if there any rows in df1 that falls under criteria 
    df4 = df4.append(df3)
### append filtered results of one row to empty dataframe 

它有效,但需要很长时间 - 我尝试过滤 2% 的数据,大约需要 25 分钟

有什么办法可以加快速度吗?

标签: pythonpandas

解决方案


尝试这个:

df3 = df1.merge(df2)
df3 =df3.loc[(df3['date']>=df3['StartDate'])&(df3['date']<=df3['EndDate'])]
df3.drop(['date'], axis = 1)

推荐阅读