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

拼接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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:45:05