如何在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
相关产品推荐
相关产品推荐

