如何将DataFrame2的sample ids按顺序补入无空值的DataFrame1
问题解决方法
首先明确适用前提:两个DataFrame行数一致,样本按行顺序一一对应,仅DF2的sample ids列是完整值,DF1其他字段无缺失可用于补全数据。
解决方案
方案1:仅需要给DF1补充sample ids列
如果DF2仅需用到sample ids字段,直接按行顺序赋值即可,不会生成多余列:
df1['sample ids'] = df2['sample ids']
方案2:需要保留两个DataFrame的所有字段,且用DF1补全DF2的缺失值
如果两个DF都有需要保留的其他字段,通过临时顺序索引做匹配即可:
# 给两个DataFrame新增相同的顺序索引列 df1['temp_order'] = range(len(df1)) df2['temp_order'] = range(len(df2)) # 按顺序索引关联两个表,避免按sample ids值匹配不到的问题 merged_df = pd.merge(df1, df2, on='temp_order', how='outer', suffixes=('_df1', '_df2')) # 合并sample ids列,优先取DF2的完整值 merged_df['sample ids'] = merged_df['sample ids_df2'].combine_first(merged_df['sample ids_df1']) # 按需合并其他列:用DF1的无空值数据补全DF2的对应列缺失值 merged_df['需要补全的列名'] = merged_df['需要补全的列名_df1'].combine_first(merged_df['需要补全的列名_df2']) # 清理临时列和拆分的冗余列,得到最终结果 merged_df = merged_df.drop(columns=['temp_order', 'sample ids_df1', 'sample ids_df2'])
之前操作失败的原因
- 调用
pd.concat([DF1,DF2],axis=1)时,pandas不会自动合并同名字段,只会对重名列加后缀区分,所以两个sample ids会拆分为独立列。 - 调用
pd.merge默认按同名列的取值做匹配,而DF1和DF2的sample ids没有重叠取值,无法匹配到对应行,因此得不到预期结果。
内容的提问来源于stack exchange,提问作者Michael Ray
相关产品推荐
相关产品推荐

