[英]Merging DataFrames based on Condition
我正在尝试根据一个数据帧值在另一个数据帧的值范围内合并两个数据帧。 我的数据看起来像这样
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)
我可以做些什么来优化它/使其更有效地运行? 我找不到任何基于条件合并熊猫数据框的示例
你检查过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 61
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.