python单细胞测序分析教程-0 | 数据结构及操作
2020-09-17 本文已影响0人
切瓜少年
目录
- 根据barcodes的名称获取数据的meta信息,或批量修改var或obs对象
- 查看是否有重名的基因,或查看基因是否存在
- 将Anndata导出为csv
- 删除特定基因
- 获取矩阵数据没有经过尺度归一化的raw adata数据
- 根据obs对象的信息(聚类等)获取barcodes index
- 根据Index获取adata的部分
- 查看某些基因是否在同一个细胞中表达
- 删除obs中的某一列
- 多个adata组合
1、根据barcodes的名称获取数据的meta信息
# 获取barcodes名
obs_name_list = adata.obs_names.to_list()
obs_name_list
OUTS:
['AAATGCCCAATCTGCA_Ileum-1_Enterocyte',
'AACTCTTGTCTAGTCA_Ileum-1_Enterocyte',
'AAGACCTCACGGACAA_Ileum-1_Enterocyte',
'AAGCCGCGTCTTGCGG_Ileum-1_Enterocyte',
'AAGTCTGGTTGTCTTT_Ileum-1_Enterocyte',
......
]
# 根据barcodes名的组成模式,选择分割符
obs_name_list = [i.split("_") for i in obs_name_list]
obs_name_list
OUTS:
[['AAATGCCCAATCTGCA', 'Ileum-1', 'Enterocyte'],
['AACTCTTGTCTAGTCA', 'Ileum-1', 'Enterocyte'],
['AAGACCTCACGGACAA', 'Ileum-1', 'Enterocyte'],
['AAGCCGCGTCTTGCGG', 'Ileum-1', 'Enterocyte'],
['AAGTCTGGTTGTCTTT', 'Ileum-1', 'Enterocyte'],
['ACGAGGATCGGCCGAT', 'Ileum-1', 'Enterocyte'],
['ACGGCCAGTCTAAACC', 'Ileum-1', 'Enterocyte'],
['AGGCCGTTCGAGCCCA', 'Ileum-1', 'Enterocyte'],
['AGTGAGGGTCGGCTCA', 'Ileum-1', 'Enterocyte'],
['ATGAGGGAGGATATAC', 'Ileum-1', 'Enterocyte'],
['ATGAGGGCAAGGTTCT', 'Ileum-1', 'Enterocyte'],
['ATGAGGGTCTGCCAGG', 'Ileum-1', 'Enterocyte'],
['ATTGGACGTTGAGTTC', 'Ileum-1', 'Enterocyte'],
......
]
# 获取批次信息
batch_name_list = []
for i in obs_name_list:
# barcodes的第2个元素(i[1])对应了器官和器官序号,即batch信息
j = i[1]
batch_name_list.append(j)
# 获取batch的list,注意list一定是和barcodes的数量等长
adata.obs['batch'] = batch_name_list
adata.obs
OUTS:
batch
AAATGCCCAATCTGCA_Ileum-1_Enterocyte Ileum-1
AACTCTTGTCTAGTCA_Ileum-1_Enterocyte Ileum-1
AAGACCTCACGGACAA_Ileum-1_Enterocyte Ileum-1
AAGCCGCGTCTTGCGG_Ileum-1_Enterocyte Ileum-1
AAGTCTGGTTGTCTTT_Ileum-1_Enterocyte Ileum-1
... ...
2. 查看基因在数据集中是否存在,或是否有重名的基因
(1)查看是否有重名基因
起因是在整合不同文章开源的数据的时候发现一个报错,提示Reindexing only valid with uniquely valued Index objects(重新索引仅对唯一值索引对象有效),这个报错意味着obs_names(barcodes)或者var_names(gene)存在重复的对象,导致在整合时无法处理。
adata = adata_1.concatenate([adata_2,adata_3,adata_4],join='outer')
---------------------------------------------------------------------------
InvalidIndexError Traceback (most recent call last)
<ipython-input-3-17e328e1a874> in <module>
----> 1 adata = adata_1.concatenate([adata_2,adata_3,adata_4],join='outer')
/mnt/f/Linux/anaconda/envs/pytorch/lib/python3.7/site-packages/anndata/_core/anndata.py in concatenate(self, join, batch_key, batch_categories, uns_merge, index_unique, fill_value, *adatas)
1705 fill_value=fill_value,
1706 index_unique=index_unique,
-> 1707 pairwise=False,
1708 )
1709
/mnt/f/Linux/anaconda/envs/pytorch/lib/python3.7/site-packages/anndata/_core/merge.py in concat(adatas, axis, join, merge, uns_merge, label, keys, index_unique, fill_value, pairwise)
800 )
801 reindexers = [
--> 802 gen_reindexer(alt_indices, dim_indices(a, axis=1 - axis)) for a in adatas
803 ]
804
/mnt/f/Linux/anaconda/envs/pytorch/lib/python3.7/site-packages/anndata/_core/merge.py in <listcomp>(.0)
800 )
801 reindexers = [
--> 802 gen_reindexer(alt_indices, dim_indices(a, axis=1 - axis)) for a in adatas
803 ]
804
/mnt/f/Linux/anaconda/envs/pytorch/lib/python3.7/site-packages/anndata/_core/merge.py in gen_reindexer(new_var, cur_var)
393 [1., 0., 0.]], dtype=float32)
394 """
--> 395 return Reindexer(cur_var, new_var)
396
397
/mnt/f/Linux/anaconda/envs/pytorch/lib/python3.7/site-packages/anndata/_core/merge.py in __init__(self, old_idx, new_idx)
265 self.no_change = new_idx.equals(old_idx)
266
--> 267 new_pos = new_idx.get_indexer(old_idx)
268 old_pos = np.arange(len(new_pos))
269
/mnt/f/Linux/anaconda/envs/pytorch/lib/python3.7/site-packages/pandas/core/indexes/base.py in get_indexer(self, target, method, limit, tolerance)
2985 if not self.is_unique:
2986 raise InvalidIndexError(
-> 2987 "Reindexing only valid with uniquely valued Index objects"
2988 )
2989
InvalidIndexError: Reindexing only valid with uniquely valued Index objects
- 首先,尝试对不同adata的组合进行整合,判断出现重复的adata。发现adata_3存在时会报错,其他adata都可以整合。
- 其次,排除barcodes的重复,对adata_3的barcodes进行重命名,在重命名的过程中发现,barcodes被提示最好使用符号型元素而不是数值型元素。重命名方法如下:
# 获取barcodes列表,以便于循环
obs_name_list = adata_3.obs_names.to_list()
n = 'aaa'
m = 0
re_name_list = []
for i in obs_name_list:
j = n + '%d' %m
m = m+1
re_name_list.append(j)
adata_3.obs_names = re_name_list
重命名保证barcodes不会重复后,再次尝试整合还是出现相同报错,表明问题出在var_names上。下面查找重复基因。
# 查找重复基因名,发现一个重复基因名
adata_3.var[adata_3.var.index.duplicated()]
OUTS:
n_cells
NAA38 1522
# 定位重复基因,该基因重复了两次
adata_3.var.loc['NAA38']
OUTS:
n_cells
NAA38 523
NAA38 1522
# 删除重复基因(删除的前提是得先确认这个基因对研究的意义不大,也不是什么特别的细胞群的marker基因)
# 剔除NAA38基因
non_NAA38_genes_list = [name for name in adata.var_names if not name.startswith('NAA38')]
adata_3 = adata_3[:, non_NAA38_genes_list]
重新测试数据整合,发现可以整合了。
(2)查看基因'obj'是否存在,也可以用来判断该基因是否重名
list.count() 方法用来统计某个元素在列表中出现的次数,基本语法格式为:
# listname 代表列表名,obj 表示要统计的元素
# 如果 count() 返回 0,就表示列表中不存在该元素,所以 count() 也可以用来判断列表中的某个元素是否存在
listname.count(obj)
应用在adata里:
# 测试TPH1,返回1表示该基因存在,且只有唯一的基因为该基因名;
# 若返回值为大于1的值,表明该基因出现了重名。
adata.var_names.to_list().count('TPH1')
OUTS:
1