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
相关产品推荐
相关产品推荐

