python - 根据来自另一个 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 分钟
有什么办法可以加快速度吗?
解决方案
尝试这个:
df3 = df1.merge(df2)
df3 =df3.loc[(df3['date']>=df3['StartDate'])&(df3['date']<=df3['EndDate'])]
df3.drop(['date'], axis = 1)
推荐阅读
- html - 如何在不破坏标题的情况下将盒子放在网站中间?
- python - 使用蓝牙从 Arduino 读取数据到 Python
- c# - 水晶报表打开连接失败
- training-data - KITTI 数据集裁剪标记点云
- haskell - 无法从实例声明的超类中推断出(半群(可选 a))
- mysql - customer_code '在where子句中不是明确的吗?
- python - Python - 抓取 IMDb 网站时出现 XPath 问题
- html - 导航栏中的下拉菜单未显示元素列表(Angular 6)
- c# - await SendAsync 不在 TPL 数据流 BatchBlock 上等待
- keras - 如何设置正确的 classLabels 数量?