首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于条件的DataFrames合并

基于条件的DataFrames合并
EN

Stack Overflow用户
提问于 2021-07-02 22:03:57
回答 1查看 40关注 0票数 1

我正在尝试基于一个数据帧值在另一个数据帧值的范围内合并两个数据帧。我的数据如下所示

代码语言:javascript
复制
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),因此它将返回如下所示的内容

代码语言:javascript
复制
  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个股票观察的数据集中运行得非常慢

代码语言:javascript
复制
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数据帧的示例

EN

回答 1

Stack Overflow用户

发布于 2021-07-02 22:40:41

你查过pd.merge_asof(...)了吗?它有一个带有报价器的例子。注意这里的tolerance参数。

为了从headingsdf中保留anomaly_heading,我们需要复制它。

代码语言:javascript
复制
>>> 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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68226546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档