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

pandas merge操作中获取两个DataFrame共通行对应原始行索引的方法

解决方案:获取pandas内连接对应的原始表行索引

核心实现逻辑:合并前将两个DataFrame的原生索引转为带唯一标识的普通列,合并后即可直接提取两边原始表的对应行索引,再用索引过滤原表即可完全保留原表结构。

完整可运行代码如下:

import pandas as pd
import numpy as np

rng = pd.date_range('2015-02-24', periods=5, freq='T')
df_1 = pd.DataFrame({ 'timestamp': rng, 'Val': np.random.randn(len(rng)) })
df_1 = df_1.drop(df_1.index[[0]])
df_2 = pd.DataFrame({ 'timestamp': rng, 'Val': np.random.randn(len(rng)) })
df_2 = df_2.drop(df_2.index[[4]])

# 核心修改:两个表都把索引转为带标识的列再合并
common_rows = pd.merge(
    df_1.reset_index(names='idx_df1'),  # df1原始索引存为idx_df1列
    df_2.reset_index(names='idx_df2'),  # df2原始索引存为idx_df2列
    how='inner',
    on=['timestamp']
)

# 提取两边的公共行索引
idx1_common = common_rows['idx_df1']
idx2_common = common_rows['idx_df2']

# 过滤原表,只保留公共行
df1_filtered = df_1.loc[idx1_common]
df2_filtered = df_2.loc[idx2_common]

如果使用低于1.5.0版本的pandas,不支持reset_index的names参数,可替换为兼容写法:

common_rows = pd.merge(
    df_1.reset_index().rename(columns={'index':'idx_df1'}),
    df_2.reset_index().rename(columns={'index':'idx_df2'}),
    how='inner',
    on=['timestamp']
)

最终得到的df1_filtered、df2_filtered就是两个原表仅保留公共匹配行的结果,字段和原表完全一致,没有合并带来的冗余字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:24:03