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

拼接12个AnnData对象遇基因重复问题,求正确合并方法

解决方案

问题根源

你之前误用了sc.concat的axis=1参数:该参数用于合并列(基因),会将所有样本的基因列直接拼接,导致相同基因名被自动添加后缀去重。而你的需求是合并行(barcode),将不同样本的唯一barcode整合到同一个AnnData中,同时对齐所有基因并为缺失基因填充0。

实现步骤

  1. 生成全局基因集合
    提取所有12个AnnData对象中的基因名,取它们的并集作为统一的基因列表:

    import scanpy as sc
    import anndata as ad
    import pandas as pd
    
    # 获取所有样本的基因并集
    all_genes = set()
    for adata in loom_data:
        all_genes.update(adata.var.index)
    all_genes = sorted(all_genes)
    
  2. 对齐每个AnnData到全局基因列表
    对每个样本的AnnData重新索引,确保其基因列与全局列表一致,缺失基因的计数(包括剪接/未剪接矩阵)自动填充0:

    aligned_adatas = []
    for adata in loom_data:
        # 对齐主计数矩阵(X)
        adata_aligned = adata[:, all_genes].copy()
        # 处理spliced和unspliced层
        for layer in ["spliced", "unspliced"]:
            if layer in adata.layers:
                # 将层矩阵转为DataFrame后重新索引,填充0
                layer_matrix = pd.DataFrame(
                    adata.layers[layer],
                    index=adata.obs.index,
                    columns=adata.var.index
                )
                layer_matrix_aligned = layer_matrix.reindex(columns=all_genes, fill_value=0)
                adata_aligned.layers[layer] = layer_matrix_aligned.values
        aligned_adatas.append(adata_aligned)
    
  3. 合并对齐后的AnnData
    使用axis=0(默认值,合并行)拼接所有对齐后的样本,此时所有barcode会整合为行,基因列完全对齐,缺失值已被填充0:

    merged_adata = sc.concat(aligned_adatas, join="outer")
    

验证结果

合并后你会得到一个AnnData对象,其维度应为总barcode数 × 全局基因数,且基因名不会出现重命名后缀,缺失基因的剪接/未剪接计数均为0,可直接用于scVelo分析。

内容的提问来源于stack exchange,提问作者CelineDion

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 03:10:39