我正在尝试基于一个数据帧值在另一个数据帧值的范围内合并两个数据帧。我的数据如下所示
headingdf = pd.DataFrame({'heading':['A', 'B', 'B', 'C', 'D'],
'anomaly_start':[4, 17, 40, 61, 64],
'anomaly_end':[5, 19, 41, 65, 67]})
heading anomaly_start anomaly_end
0 A 4 5
1 B 17 19
2 B 40 41
3 C 61 65
stockdf = pd.DataFrame({'ticker':['AAPL', 'AAPL', 'AMZN', 'AMZN'],
'anomaly_start':[4,18,18, 69]})
ticker anomaly_start
0 AAPL 4
1 AAPL 18
2 AMZN 18
3 AMZN 69我想返回一个数据帧,它根据异常的开始和结束时间合并数据帧。If stockdf['anomaly_start'] in range(headingdf['anomaly_start], heading['anomaly_end']+5),因此它将返回如下所示的内容
heading ticker anomaly_ticker_start anomaly_heading_start \
0 A AAPL 4 4
1 B AAPL 18 17
2 B AMZN 18 17
3 C AMZN 69 61
4 D AMZN 69 64
anomaly_heading_end
0 5
1 19
2 19
3 65
4 67 到目前为止,下面的代码返回了我需要的内容,但是它没有很好的伸缩性,并且在我的包含25000个航向观察和16000个股票观察的数据集中运行得非常慢
matched_anomalys = pd.DataFrame(columns = ['heading',
'ticker',
'anomaly_ticker_start',
'anomaly_heading_start',
'anomaly_heading_end'])
for _, hrow in headingdf.iterrows():
for _, srow in stockdf.iterrows():
if int(srow['anomaly_start']) in range(int(hrow['anomaly_start']),int(hrow['anomaly_end'])+5):
matched_anomalys = matched_anomalys.append({'heading':hrow['heading'],
'ticker':srow['ticker'],
'anomaly_ticker_start':srow['anomaly_start'],
'anomaly_heading_start':hrow['anomaly_start'],
'anomaly_heading_end':hrow['anomaly_end']}, ignore_index=True)我可以做些什么来优化它/使它更高效地运行?我找不到任何基于条件合并pandas数据帧的示例
发布于 2021-07-02 22:40:41
你查过pd.merge_asof(...)了吗?它有一个带有报价器的例子。注意这里的tolerance参数。
为了从headingsdf中保留anomaly_heading,我们需要复制它。
>>> headingdf["anomaly_heading_start"] = headingdf["anomaly_start"]
>>> pd.merge_asof(stockdf, headingdf, on="anomaly_start")
ticker_x anomaly_start ticker_y anomaly_end anomaly_heading_start
0 AAPL 4 A 5 4
1 AMZN 18 B 19 17
2 AMZN 70 C 65 61https://stackoverflow.com/questions/68226546
复制相似问题