繁体   English   中英

基于条件合并数据帧

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM