Python编写比对两个DataFrame并生成新DataFrame的函数方法
Python DataFrame 匹配提取实现方案
实现思路
- 分别为两个DataFrame生成
MT_NET列的绝对值作为匹配辅助键 - 以
NUMBER交易代码、MT_NET绝对值作为共同匹配条件做内连接,筛选出同时满足两个匹配规则的行 - 拆分连接结果,提取两个DataFrame的匹配原行合并为最终输出
实现代码
import pandas as pd def match_mt_data(df_EX: pd.DataFrame, df_VE: pd.DataFrame) -> pd.DataFrame: # 新增临时列存储MT_NET绝对值,不影响原数据 df_EX = df_EX.copy() df_VE = df_VE.copy() df_EX['abs_mt'] = df_EX['MT_NET'].abs() df_VE['abs_mt'] = df_VE['MT_NET'].abs() # 内连接匹配符合条件的行 match_pairs = pd.merge( df_EX, df_VE, on=['NUMBER', 'abs_mt'], suffixes=('_ex', '_ve') ) # 提取匹配到的df_EX原行数据 ex_cols = [col for col in df_EX.columns if col != 'abs_mt'] ex_rows = match_pairs[[f'{c}_ex' for c in ex_cols]] ex_rows.columns = ex_cols # 提取匹配到的df_VE原行数据 ve_cols = [col for col in df_VE.columns if col != 'abs_mt'] ve_rows = match_pairs[[f'{c}_ve' for c in ve_cols]] ve_rows.columns = ve_cols # 合并结果返回 return pd.concat([ex_rows, ve_rows], ignore_index=True)
调用方式
# 直接传入待比对的两个DataFrame即可得到结果 output_df = match_mt_data(df_EX, df_VE)
注意事项
- 输出的新DataFrame列结构和原两个DataFrame完全一致
- 不会修改传入的原始
df_EX和df_VE数据 - 支持一对多、多对多的匹配场景,所有符合条件的行都会被提取
内容的提问来源于stack exchange,提问作者Hedi Ben Khalifa
相关产品推荐
相关产品推荐

