You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中高效查找B列ID在A列的上一次出现并获取对应C值?

解决方案

针对200万行的大型DataFrame,推荐使用pd.merge_asof实现需求,这是Pandas原生的向量化方法,效率远高于循环,能满足大数据量的处理需求。

核心思路

跟踪每个ID在A列出现时的C值,为每行的B列ID匹配该行之前在A列出现过的对应记录的C值(默认取最近一次出现的C值)。

具体实现步骤

  1. 构建辅助数据集:提取A列的ID、对应C值及行索引(用于判断记录的先后顺序)

    import pandas as pd
    
    # 假设原DataFrame名为df,包含列A、B、C
    a_records = df.reset_index()[['index', 'A', 'C']].rename(columns={'A': 'ID', 'C': 'A_C'})
    
  2. 准备待匹配数据集:提取原DataFrame的行索引和B列ID

    df_with_idx = df.reset_index()[['index', 'B']]
    
  3. 使用merge_asof匹配:按ID分组匹配,确保只取当前行之前的A列记录

    # 按行索引排序后执行匹配,direction='backward'取最近的前置记录
    matched = pd.merge_asof(
        df_with_idx.sort_values('index'),
        a_records.sort_values('index'),
        left_on='index',
        right_on='index',
        left_by='B',
        right_by='ID',
        direction='backward'
    )
    
  4. 合并结果到原DataFrame

    # 按原索引恢复顺序,将匹配到的C值存入新列
    df['previous_C'] = matched.set_index('index')['A_C'].reindex(df.index)
    

关键参数说明

  • left_by/right_by:指定按ID分组匹配,确保B列ID与A列ID对应同一实体
  • direction='backward':在当前行的索引之前,查找最近的匹配记录;若需取最早出现的记录,可先对a_records按ID分组保留最早的记录,再执行匹配:
    # 先保留每个ID在A列第一次出现的记录
    a_records_first = a_records.groupby('ID').agg({'index': 'min', 'A_C': 'first'}).reset_index()
    # 再执行merge_asof匹配
    matched_first = pd.merge_asof(
        df_with_idx.sort_values('index'),
        a_records_first.sort_values('index'),
        left_on='index',
        right_on='index',
        left_by='B',
        right_by='ID',
        direction='backward'
    )
    df['previous_C_first'] = matched_first.set_index('index')['A_C'].reindex(df.index)
    

方法优势

  • 向量化操作,时间复杂度为O(n log n),适合处理百万级数据
  • 完全基于Pandas原生函数,无需自定义循环或复杂逻辑

内容的提问来源于stack exchange,提问作者Mark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 10:35:20