You need to enable JavaScript to run this app. Pandas实现两个DataFrame按列值匹配合并,过滤无匹配冗余条目
优惠活动
大模型
产品
解决方案
定价
更多

Pandas实现两个DataFrame按列值匹配合并,过滤无匹配冗余条目

问题根因分析
  • 原外连接方案问题:how='outer'会保留两张表所有行的匹配结果,未匹配的FTM、LRC等条目会被一并保留,不符合仅保留双表匹配项的需求。
  • 原numpy where方案问题:两张表行数不一致(df1共3行、df2共5行),直接做列等值比较会触发形状不匹配报错;且np.where仅返回匹配位置的索引,无法直接合并两张表的全量字段,不适用于该场景。
正确实现方案

方案1:使用pandas内连接merge(推荐)

核心逻辑:内连接会自动过滤掉两张表中币种字段无法匹配的冗余行,仅保留匹配成功的条目,完全符合需求。

# 复现原始数据
import pandas as pd

data1 = [['BTC', 2], ['ETH', 1], ['ADA', 100]]
df1 = pd.DataFrame(data1, columns=['Coin', 'Quantity'])

data2 = [['BTC', 50000], ['FTM', 50], ['ETH', 1500], ['LRC', 5], ['ADA', 20]]
df2 = pd.DataFrame(data2, columns=['code_name', 'selling rate'])

# 执行合并
merged_df = df1.merge(
    df2,
    how='inner', # 替换原方案的how='outer',为核心修改点
    left_on='Coin',
    right_on='code_name'
)

# 删除冗余的code_name列,得到目标结构
final_df = merged_df.drop(columns=['code_name'])

最终输出结果完全符合预期:

CoinQuantityselling rate
BTC250000
ETH11500
ADA10020

方案2:使用map字段映射实现

如果不需要冗余的合并中间列,也可以通过索引映射实现,自动过滤无匹配条目:

# 生成币种到卖价的映射字典
rate_map = df2.set_index('code_name')['selling rate']
# 为df1匹配新增卖价字段
df1['selling rate'] = df1['Coin'].map(rate_map)
# 删除无匹配的空值行,得到最终结果
final_df = df1.dropna()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 10:54:02