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

pandas外合并删除指定行时如何保留DataFrame原始索引

Pandas多表差集保留原始索引实现方案

问题说明

  • 全量DataFrame rates 以股票代码Ticker为索引,存储全量产品费率数据
  • 子集DataFrame aig_df 包含rates中需要被剔除的部分行
  • 现有pd.merge实现的差集逻辑会丢失原Ticker索引,返回默认整型索引,不符合业务要求
  • 原有问题代码如下:
rates = pd.read_sql("SELECT Ticker, Carrier, Product, Name, CDSC,StrategyTerm,ParRate,Spread,Fee,Cap FROM ProductRates ", conn).set_index('Ticker')

aig_df = rates.query('Product == "X5 Advantage AnnuitySM"')

competitors_df = pd.merge(rates, aig_df[['Carrier', 'Product', 'Name','CDSC','StrategyTerm','ParRate','Spread','Fee','Cap']],indicator=True,
                          how='outer').query('_merge=="left_only"').drop('_merge',axis=1)

问题原因

pd.merge做连接操作时默认不会保留左表的自定义索引,连接完成后会重置为从0开始的默认RangeIndex,这是原有代码丢失Ticker索引的核心原因。

实现方案

方案1:索引差集筛选(当前场景最优,性能最高)

由于aig_df本身就是从rates中直接筛选得到的子集,二者行索引完全对齐,直接通过索引取反筛选即可,全程不会丢失原索引:

rates = pd.read_sql("SELECT Ticker, Carrier, Product, Name, CDSC,StrategyTerm,ParRate,Spread,Fee,Cap FROM ProductRates ", conn).set_index('Ticker')
aig_df = rates.query('Product == "X5 Advantage AnnuitySM"')
# 筛选索引不在aig_df中的行,自动保留原Ticker索引
competitors_df = rates[~rates.index.isin(aig_df.index)]

该方案基于pandas索引匹配实现,在大型DataFrame场景下性能远高于全字段merge匹配。

方案2:兼容原merge逻辑的索引保留写法

如果后续需要调整匹配规则,必须通过Carrier、Product等业务字段做匹配剔除(比如aig_df来源不是rates本身),只需要在merge前暂存原索引,匹配完成后恢复即可:

competitors_df = (
    # 先把Ticker索引转为普通列暂存
    rates.reset_index()
    .merge(
        aig_df[['Carrier', 'Product', 'Name','CDSC','StrategyTerm','ParRate','Spread','Fee','Cap']],
        indicator=True,
        how='outer'
    )
    .query('_merge=="left_only"')
    .drop('_merge',axis=1)
    # 匹配完成后重新把Ticker设为索引,和原表结构一致
    .set_index('Ticker')
)

该写法和原有代码的匹配逻辑完全一致,不会改变业务判断规则,只是补充了索引的暂存和恢复步骤。

方案3:concat去重实现

如果两个DataFrame结构完全一致,也可以通过拼接去重的方式快速实现差集,自动保留原索引:

# 把aig_df拼接两次,重复出现的行就是需要剔除的aig数据
competitors_df = pd.concat([rates, aig_df, aig_df]).drop_duplicates(keep=False)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 23:15:11