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'])
最终输出结果完全符合预期:
| Coin | Quantity | selling rate |
|---|---|---|
| BTC | 2 | 50000 |
| ETH | 1 | 1500 |
| ADA | 100 | 20 |
方案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。
相关产品推荐
相关产品推荐

