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)
<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
  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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342