You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中合并行列数不同的DataFrame?解决KeyError问题

解决Pandas合并DataFrame时的KeyError问题

错误原因

你遇到的KeyError: 'Number of Mutations'是因为merge方法要求指定的连接键必须同时存在于两个要合并的DataFrame中。你的df1包含"Number of Mutations"列,但df2的列是"Number of Bases",根本没有这个连接键,所以无法执行合并操作。

merge是用于基于共同列关联数据的方法,而你的两个DataFrame没有可关联的共同列,不能直接这么用。下面根据不同需求给出对应解决方案:

方案1:将df2内容作为额外行追加到df1

如果只是想把两个DataFrame的行合并到一起,用pd.concat即可,缺失的列会自动填充NaN:

import pandas as pd

df1= pd.DataFrame({"Mutations": ["A>T", "A>G", "A>C", "T>A", "T>C", "T>G", "C>A", "C>T", "C>G", "G>A", "G>T", "G>C"], 
                   "Number of Mutations": [213, 659, 281, 204, 627, 208, 351, 1004, 360, 1054, 323, 351]})

df2= pd.DataFrame({"Number of Bases":["A = 42239", "T = 55005", "G = 46060" , "C = 45422"]})

# 行合并,重置索引避免重复
mdf = pd.concat([df1, df2], ignore_index=True)
print(mdf)

方案2:将df2内容作为新列添加到df1

如果想把df2的内容作为新列附加到df1右侧,同样用pd.concat,指定axis=1即可,行数不足的部分会填充NaN:

mdf = pd.concat([df1, df2], axis=1)
print(mdf)

方案3:关联突变对应的碱基数量(若为此需求)

如果你的真实需求是把每个突变对应的源碱基数量关联起来(比如A>T中的A对应碱基A的总数),需要先拆分处理两个DataFrame的内容,再进行合并:

import pandas as pd

df1= pd.DataFrame({"Mutations": ["A>T", "A>G", "A>C", "T>A", "T>C", "T>G", "C>A", "C>T", "C>G", "G>A", "G>T", "G>C"], 
                   "Number of Mutations": [213, 659, 281, 204, 627, 208, 351, 1004, 360, 1054, 323, 351]})

df2= pd.DataFrame({"Number of Bases":["A = 42239", "T = 55005", "G = 46060" , "C = 45422"]})

# 拆分df2的碱基和数量,转为结构化数据
df2[['Base', 'Base Count']] = df2['Number of Bases'].str.split(' = ', expand=True)
df2['Base Count'] = df2['Base Count'].astype(int)
df2 = df2.drop('Number of Bases', axis=1)

# 从df1的突变字符串中提取源碱基(比如A>T取第一个字符A)
df1['Source Base'] = df1['Mutations'].str[0]

# 基于源碱基关联两个DataFrame
mdf = df1.merge(df2, left_on='Source Base', right_on='Base', how='left')
mdf = mdf.drop('Base', axis=1)
print(mdf)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 06:55:14