拼接55个同列异行DataFrame并将缺失值填充为0的实现问题
问题解决方案
你之前的拼接逻辑存在错误,使用axis=1横向拼接所有读入的文件时,仅会按照行号对应拼接数据,不会按gene列的内容对齐,因此会出现大量重复的gene列,且不同文件的基因无法正确匹配,直接使用set_index自然无法达到预期效果。
最优解决方案:调整读取拼接逻辑
直接在读取每个文件时就将gene设为索引,后续拼接时自动按基因名称对齐,代码如下:
import os import pandas as pd path = r'/data/user/files' files = os.listdir(path) file_score = [os.path.join(path,i) for i in files if i.endswith('tped')] score_list = [] for file_path in file_score: # 读取单个文件 df = pd.read_csv(file_path, sep='\t', header=0) # 将gene列设为索引,仅保留数值列 df = df.set_index('gene') score_list.append(df) # 横向拼接,自动取所有gene的并集作为索引,缺失值填充为0 final_df = pd.concat(score_list, axis=1).fillna(0) # 如果需要将gene从索引转为普通列,可执行以下代码 # final_df = final_df.reset_index()
方案说明
- 每个文件处理后仅保留对应样本的数值列,索引为该文件包含的基因名
pd.concat默认按索引对齐,axis=1横向拼接时会自动取所有索引的并集,覆盖所有出现过的基因fillna(0)将所有缺失的基因-样本对应值统一填充为0,完全符合需求
可选补救方案:处理已拼接完成的错误数据
如果你已经生成了重复gene列的拼接结果,可通过以下代码重构数据框,本方案效率低于上述最优方案,仅做备用:
# 提取所有gene列的位置 gene_cols = [col for col in score.columns if col == 'gene'] # 提取所有file列的位置 file_cols = [col for col in score.columns if col.startswith('file')] res_df = pd.DataFrame() # 逐个提取每个文件的gene和对应数值,合并到结果中 for g_col, f_col in zip(gene_cols, file_cols): tmp = score[[g_col, f_col]].set_index(g_col) tmp.columns = [f_col] res_df = res_df.join(tmp, how='outer') # 填充缺失值为0 res_df = res_df.fillna(0)
内容的提问来源于stack exchange,提问作者ARJ
相关产品推荐
相关产品推荐

