單細(xì)胞不同樣本數(shù)據(jù)整合-解決AnnData合并時(shí)ValueError: cannot reindex from a duplicate axis問題

項(xiàng)目場景:

使用scanpy包進(jìn)行單細(xì)胞數(shù)據(jù)分析時(shí),往往需要整合多個(gè)樣本的數(shù)據(jù),也就是將多個(gè)AnnData對象合并為一個(gè)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)

問題描述:

在一次合并中,出現(xiàn)報(bào)錯(cuò):“ValueError: cannot reindex from a duplicate axis”

原因分析:

“ValueError: cannot reindex from a duplicate axis”,按我的理解是指合并方向上的索引出現(xiàn)重復(fù)。

在本例中即adata_1和adata_2中的adatas.obs_names(adata.obs.index)有重復(fù)。
來看看單個(gè)數(shù)據(jù)的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)

可以看到未經(jīng)處理的index默認(rèn)就是每個(gè)細(xì)胞的barcode字符串

第一種可能:單個(gè)數(shù)據(jù)內(nèi)部obs.index重復(fù)(因?yàn)閕ndex是單個(gè)實(shí)驗(yàn)的barcode,因此可能性比較?。?;
第二種可能:兩個(gè)數(shù)據(jù)使用了相同的obs.index造成重復(fù)(兩個(gè)實(shí)驗(yàn)的barcode重復(fù),可能性比較大).

接下來依次排查解決。
解決方案:
首先,為排除第一種可能,對單個(gè)數(shù)據(jù)的obs_name進(jìn)行make_unique,調(diào)用AnnData對象obs_names_make_unique函數(shù):

data_1.obs_names_make_unique()
data_2.obs_names_make_unique()

再次進(jìn)行數(shù)據(jù)合并:
adata = ad.concat(adata, merge = "same")
不再出現(xiàn)報(bào)錯(cuò),問題解決。
但出現(xiàn)警告:

Observation names are not unique. To make them unique, call `.obs_names_make_unique`.

說明第二種可能性也發(fā)生了,即不同樣本使用了相同的barcode,造成合并后index和細(xì)胞不一一對應(yīng)。
為了區(qū)分不同樣本的obs,在原先默認(rèn)的obs.index上加上樣本標(biāo)記,例如:

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”,用來在后續(xù)整合分析中區(qū)分各樣本。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容