如何合并含部分重叠列值的两个Pandas DataFrame?
Pandas DataFrame合并问题
问题描述
我需要合并两个Pandas DataFrame,尝试多种方法后仍未得到预期结果。
df1结构:
| Hit | Well | Protein |
|---|---|---|
| 1 | A1 | alpha |
| 2 | NaN | beta |
| 3 | NaN | gamma |
| 1 | A2 | alpha |
| 2 | NaN | beta |
| 3 | NaN | delta |
| 1 | A3 | beta |
| 2 | NaN | gamma |
df2结构:
| well | species |
|---|---|
| A1 | Dog |
| A2 | Cat |
| A3 | Bird |
预期合并结果:
| Hit | Well | Protein | Species |
|---|---|---|---|
| 1 | A1 | alpha | Dog |
| 2 | NaN | beta | NaN |
| 3 | NaN | gamma | NaN |
| 1 | A2 | alpha | Cat |
| 2 | NaN | beta | NaN |
| 3 | NaN | delta | NaN |
| 1 | A3 | beta | Bird |
| 2 | NaN | gamma | NaN |
尝试过的代码:
testing = pd.concat([df1,df2], ignore_index=True, axis=0) tesnjee = df1.combine_first(df2) tesin2= pd.merge(df1,df2, on='well') flame = [df1,df2] testin3 = reduce(lambda left,right: pd.merge(left,right,on=['well']), flame)
解决方案
核心问题有两个:一是列名大小写不匹配,二是合并类型选错了。具体修正和方案如下:
修正后的代码
# 左连接匹配,指定左右表的关联列解决大小写问题 result = pd.merge(df1, df2, left_on='Well', right_on='well', how='left') # 删除重复的well列,让结果更贴合预期 result = result.drop('well', axis=1) # 重命名species列,统一首字母大写格式 result = result.rename(columns={'species': 'Species'})
代码说明
- 列名匹配:df1的关联列是
Well(首字母大写),df2是well(全小写),用left_on和right_on分别指定两边的关联列,解决大小写不匹配导致的关联失败; - 左连接类型:
how='left'会保留df1的所有行,df2中没有匹配到的行自动填充NaN,完全符合你的预期结果; - 格式调整:
drop和rename是为了让输出格式和你给出的预期完全一致,可根据实际需求选择是否保留。
内容的提问来源于stack exchange,提问作者Soef
相关产品推荐
相关产品推荐

