【问题标题】:Merging DataFrames based on Condition根据条件合并 DataFrame
【发布时间】:2021-07-02 14:03:57
【问题描述】:

我正在尝试根据一个数据帧的值在另一个数据帧的值范围内合并两个数据帧。我的数据是这样的

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)

我可以做些什么来优化它/使它更有效地运行?我找不到任何基于条件合并熊猫数据框的示例

【问题讨论】:

    标签: python pandas performance optimization


    【解决方案1】:

    你检查过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
    

    【讨论】:

    • 这将是一对一的匹配,对吧?有时标题有多个匹配项,反之亦然。我已经更新了我的数据以反映这一点
    • @EthanSurdykowski 这是个好问题。暂时不知道。
    猜你喜欢
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    相关资源
    最近更新 更多