DataFrame匹配赋值报错:值与索引长度不匹配的解决方法
解决DataFrame匹配赋值时的长度不匹配问题
你遇到的错误是因为np.where要求比较的序列长度必须一致,但df_luad(521行)和df_tmb(586行)行数不同,逐行匹配的逻辑不成立,所以抛出长度不匹配的报错。下面是两种可靠的解决方案,确保仅为df_luad中匹配的行填充对应TMB值:
方法一:使用左连接合并DataFrame
以df_luad为基准,通过pd.merge做左连接,自动匹配对应TMB值,未匹配的行留空(NaN):
import pandas as pd # 仅保留df_tmb中需要的列,避免合并后出现冗余 tmb_subset = df_tmb[['Patient ID', 'TMB (nonsynonymous)']] # 左连接:保留df_luad所有行,匹配df_tmb中的对应数据 df1 = df_luad.merge(tmb_subset, left_on='Tumor_Sample_Barcode', right_on='Patient ID', how='left') # 重命名列到目标名称,并清理冗余列 df1 = df1.rename(columns={'TMB (nonsynonymous)': 'tmb_value'}) df1 = df1.drop(columns=['Patient ID'])
处理后df1行数与df_luad一致(521行),匹配成功的行有对应的TMB值,未匹配的行df1['tmb_value']为NaN。
方法二:用字典映射快速赋值
先将df_tmb的匹配关系转换成字典,再通过map方法为df_luad新增列:
# 构建Patient ID到TMB值的映射字典 tmb_mapping = df_tmb.set_index('Patient ID')['TMB (nonsynonymous)'].to_dict() # 复制df_luad得到df1,并用map填充tmb_value列 df1 = df_luad.copy() df1['tmb_value'] = df1['Tumor_Sample_Barcode'].map(tmb_mapping)
这个方法更简洁,同样能保证df1行数与原df_luad一致,未匹配的行值为NaN。
内容的提问来源于stack exchange,提问作者S.EB
相关产品推荐
相关产品推荐

