python单细胞测序分析教程-0 | 数据结构及操作

目录

  1. 根据barcodes的名称获取数据的meta信息,或批量修改var或obs对象
  2. 查看是否有重名的基因,或查看基因是否存在
  3. 将Anndata导出为csv
  4. 删除特定基因
  5. 获取矩阵数据没有经过尺度归一化的raw adata数据
  6. 根据obs对象的信息(聚类等)获取barcodes index
  7. 根据Index获取adata的部分
  8. 查看某些基因是否在同一个细胞中表达
  9. 删除obs中的某一列
  10. 多个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)
 in 
----> 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 (.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
  1. 首先,尝试对不同adata的组合进行整合,判断出现重复的adata。发现adata_3存在时会报错,其他adata都可以整合。
  2. 其次,排除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

你可能感兴趣的:(python单细胞测序分析教程-0 | 数据结构及操作)