项目场景:
使用scanpy包进行单细胞数据分析时,往往需要整合多个样本的数据,也就是将多个AnnData对象合并为一个AnnData对象。
例如将adata_1和adata_2合并为adatas,可行的一种方法是:·
import anndata as ad adatas = [adata1,adata2] adatas = ad.concatenate(adatas)
(concatenate请参考https://anndata.readthedocs.io/en/latest/generated/anndata.AnnData.concatenate.html#anndata.AnnData.concatenate)
问题描述:
在一次合并中,出现报错:“ValueError: cannot reindex from a duplicate axis”
原因分析:
“ValueError: cannot reindex from a duplicate axis”,按我的理解是指合并方向上的索引出现重复。
在本例中即adata_1和adata_2中的adatas.obs_names(adata.obs.index)有重复。
来看看单个数据的obs.index:
adata_1.obs_names #adata_1.obs.index Index(['AAACCCAAGCTGTTAC-1', 'AAACCCAAGTTTCTTC-1', 'AAACCCACATGGGATG-1', 'AAACCCAGTCTGTAGT-1', 'AAACCCATCACATTGG-1', 'AAACCCATCTCTGCCA-1', 'AAACGAAAGAGTCGAC-1', 'AAACGAAAGCATTTCG-1', 'AAACGAAGTCCATAGT-1', 'AAACGCTCACCCATAA-1', ... 'TTTGGTTGTAAGCAAT-1', 'TTTGGTTGTAGCTTGT-1', 'TTTGGTTGTCACTCTC-1', 'TTTGGTTTCTCCGAAA-1', 'TTTGTTGCAATTTCTC-1', 'TTTGTTGCACTAGTAC-1', 'TTTGTTGCAGCTCATA-1', 'TTTGTTGGTCGACGCT-1', 'TTTGTTGTCCGTACGG-1', 'TTTGTTGTCCTGGTCT-1'], dtype='object', length=5699)
可以看到未经处理的index默认就是每个细胞的barcode字符串
第一种可能:单个数据内部obs.index重复(因为index是单个实验的barcode,因此可能性比较小);
第二种可能:两个数据使用了相同的obs.index造成重复(两个实验的barcode重复,可能性比较大).
接下来依次排查解决。
解决方案:
首先,为排除第一种可能,对单个数据的obs_name进行make_unique,调用AnnData对象obs_names_make_unique函数:
data_1.obs_names_make_unique() data_2.obs_names_make_unique()
再次进行数据合并:
adata = ad.concat(adata, merge = "same")
不再出现报错,问题解决。
但出现警告:
Observation names are not unique. To make them unique, call `.obs_names_make_unique`.
说明第二种可能性也发生了,即不同样本使用了相同的barcode,造成合并后index和细胞不一一对应。
为了区分不同样本的obs,在原先默认的obs.index上加上样本标记,例如:
adata_1.obs_names=['sub_CRC3-'+x for x in adata_1.obs_names] adata_1.obs_names Index(['sub_CRC3-AAACCCAAGCTGTTAC-1', 'sub_CRC3-AAACCCAAGTTTCTTC-1', 'sub_CRC3-AAACCCACATGGGATG-1', 'sub_CRC3-AAACCCAGTCTGTAGT-1', 'sub_CRC3-AAACCCATCACATTGG-1', 'sub_CRC3-AAACCCATCTCTGCCA-1', 'sub_CRC3-AAACGAAAGAGTCGAC-1', 'sub_CRC3-AAACGAAAGCATTTCG-1', 'sub_CRC3-AAACGAAGTCCATAGT-1', 'sub_CRC3-AAACGCTCACCCATAA-1', ... 'sub_CRC3-TTTGGTTGTAAGCAAT-1', 'sub_CRC3-TTTGGTTGTAGCTTGT-1', 'sub_CRC3-TTTGGTTGTCACTCTC-1', 'sub_CRC3-TTTGGTTTCTCCGAAA-1', 'sub_CRC3-TTTGTTGCAATTTCTC-1', 'sub_CRC3-TTTGTTGCACTAGTAC-1', 'sub_CRC3-TTTGTTGCAGCTCATA-1', 'sub_CRC3-TTTGTTGGTCGACGCT-1', 'sub_CRC3-TTTGTTGTCCGTACGG-1', 'sub_CRC3-TTTGTTGTCCTGGTCT-1'], dtype='object', length=5699)
在adata_1的obs_names字符串前加上用来样本名称“sub_CRC3”,用来在后续整合分析中区分各样本。