关于 R 版本的生信分析笔记太多了,R 生态的生信分析笔记超全。但是随着数据量的日益壮大,我们有必要开始学习python了。生信技能树从今年开始会大力推行 python 版本的生信生态,写超多关于 python 版本的生信分析教程。敬请关注~新专辑《python生信笔记2025》。
关于R语言读取不同的单细胞数据格式,我们前面做了超多分享:
我们来看看python版本的吧! 第一种:10x cellranger标准结果读取 10x cellranger标准结果为三个文件:barcodes.tsv.gz features.tsv.gz matrix.mtx.gz ,我们这里使用数据 GSE163558 作为参考,https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE163558。
读取方法参见Scanpy:https://scanpy.readthedocs.io/en/1.11.x/tutorials/basics/clustering-2017.html
GSE163558数据集共10个样本,下载 GSE163558_RAW.tar,处理成下面的格式:
GSE163558 ├── GSM5004180_PT1 │ ├── barcodes.tsv.gz │ ├── features.tsv.gz │ └── matrix.mtx.gz ├── GSM5004181_PT2 │ ├── barcodes.tsv.gz │ ├── features.tsv.gz │ └── matrix.mtx.gz ├── GSM5004182_PT3 │ ├── barcodes.tsv.gz │ ├── features.tsv.gz │ └── matrix.mtx.gz ├── GSM5004183_NT1 │ ├── barcodes.tsv.gz │ ├── features.tsv.gz │ └── matrix.mtx.gz ...
首先来看下单个样本的读取: import pandas as pdimport scanpy as scimport os# 使用 scanpy读取 adata = sc.read_10x_mtx( "GSE163558/GSM5004180_PT1/" , # the directory with the `.mtx` file
var_names="gene_symbols" , # use gene symbols for the variable names (variables-axis index) cache=True , # write a cache file for faster subsequent reading ) adata
读取完后,adata是一个AnnData对象,n_obs为细胞数,n_vars为基因数
读取多个并合并成一个大的anndata对象: 先看看每个目录中的样本文件夹:
# 列出当前目录中的样本 dir = os.listdir("GSE163558_RAW" ) dir ['GSM5004180_PT1' , 'GSM5004181_PT2' , 'GSM5004182_PT3' , 'GSM5004183_NT1' , 'GSM5004184_LN1' , 'GSM5004185_LN2' , 'GSM5004186_O1' , 'GSM5004187_P1' , 'GSM5004188_Li1' , 'GSM5004189_Li2' ]
for循环读取: adata = {}for i in range(len(dir)): data = sc.read_10x_mtx("GSE163558_RAW/" +dir[i], var_names="gene_symbols" , cache=True ) data.var_names_make_unique() adata[dir[i]] = data print(dir[i])
打印结果如下:
adata 现在是一个字典: adata
使用 concat 函数将多个adata连接在一起: adata = sc.concat(adata,label='sampleid' ) adata.obs_names_make_unique() adata
后续的去批次等处理可以参考:https://scanpy.readthedocs.io/en/1.11.x/tutorials/basics/integrating-data-using-ingest.html
第二种:读取 h5 格式 10x cellranger上游定量的时候除了三个标准文件,其实还有一个同样内容的 h5 格式数据,还是使用scanpy:
这里使用 https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE175687为例,共有四个样本,下载 GSE175687_RAW.tar 附件:
GSM5344021_WT_tumor_filtered_feature_bc_matrix.h5
GSM5344022_WT_normal.adjacent.lung_filtered_feature_bc_matrix.h5 GSM5344023_B1.KO_tumor_filtered_feature_bc_matrix.h5 GSM5344024_B1.KO_normal.adjacent.lung_filtered_feature_bc_matrix.h5
单个和多样本读取: import pandas as pdimport scanpy as scimport osimport re# 目录下的文件 files = os.listdir("GSE175687_RAW" ) files# ['GSM5344021_WT_tumor_filtered_feature_bc_matrix.h5', # 'GSM5344022_WT_normal.adjacent.lung_filtered_feature_bc_matrix.h5', # 'GSM5344023_B1.KO_tumor_filtered_feature_bc_matrix.h5', # 'GSM5344024_B1.KO_normal.adjacent.lung_filtered_feature_bc_matrix.h5'] # 读取单个h5文件 adata = sc.read_10x_h5("filtered_feature_bc_matrix.h5" ) adata# 多个读取 adata = {}for i in range(len(files)): data = sc.read_10x_h5("GSE175687_RAW/" + files[i]) data.var_names_make_unique() name = re.sub(r"_filtered_feature_bc.*" , "" , files[i]) adata[name] = data print(name)# 合并 print(adata) adata = sc.concat(adata,label='sampleid' ) adata.obs_names_make_unique() adata
读取完后,adata还是是一个AnnData对象,n_obs为细胞数,n_vars为基因数
第三种:读取csv格式count矩阵 有一些单细胞数据只提供了count格式的压缩矩阵,如 GSE128531 数据,https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE128531
下载GSE128531_RAW.tar附件,9个样本,都是csv格式:
GSM3679033_Labeled_SC67_050517_SK_MF2_GRCh38raw.csv.gz 10.5 Mb GSM3679034_Labeled_SC82_060617_SK_MF5_GRCh38raw.csv.gz 18.2 Mb GSM3679035_SC157dataframe.csv.gz 10.9 Mb GSM3679036_SC158dataframe.csv.gz 18.4 Mb GSM3679037_SC205dataframe.csv.gz 7.0 Mb GSM3679038_Labeled_SC50_011917_SK_NOR_GRCh38raw.csv.gz 6.6 Mb GSM3679039_Labeled_SC68_051517_SK_NOR_GRCh38raw.csv.gz 4.3 Mb GSM3679040_Labeled_SC124_080317_SK_NOR_GRCh38raw.csv.gz 9.6 Mb GSM3679041_Labeled_SC125_080317_SK_NOR_GRCh38raw.csv.gz
Note:这个数据还比较特殊,他的行是基因,列是细胞,所以读取进来需要进行一下转置!
单个和多样本读取:
# 导入scanpy库 import scanpy as scimport osimport re# 目录下的文件 files = os.listdir("GSE128531_RAW" ) files# ['GSM3679033_Labeled_SC67_050517_SK_MF2_GRCh38raw.csv.gz', # 'GSM3679034_Labeled_SC82_060617_SK_MF5_GRCh38raw.csv.gz', # 'GSM3679035_SC157dataframe.csv.gz', # 'GSM3679036_SC158dataframe.csv.gz', # 'GSM3679037_SC205dataframe.csv.gz', # 'GSM3679038_Labeled_SC50_011917_SK_NOR_GRCh38raw.csv.gz', # 'GSM3679039_Labeled_SC68_051517_SK_NOR_GRCh38raw.csv.gz', # 'GSM3679040_Labeled_SC124_080317_SK_NOR_GRCh38raw.csv.gz', # 'GSM3679041_Labeled_SC125_080317_SK_NOR_GRCh38raw.csv.gz'] # 读取一个样本的 csv 文件 adata = sc.read_csv("GSE128531_RAW/GSM3679033_Labeled_SC67_050517_SK_MF2_GRCh38raw.csv.gz" )
# 转置矩阵 adata = adata.T adata# 查看细胞: adata.obs.head()# 查看基因 adata.var.head()# 多个 adata = {}for i in range(len(files)): data = sc.read_csv("GSE128531_RAW/" + files[i]) # 转置矩阵 data = data.T data.var_names_make_unique() name = re.sub(r"_GRCh38.*" , "" , files[i]) name = re.sub(r"dataframe.*" , "" , name) adata[name] = data print(name) # 合并 print(adata) adata = sc.concat(adata,label='sampleid' ) adata.obs_names_make_unique() adata
结果如下:
第四种:读取h5ad 格式 上一次我们在解决一个学员的报错时: 一步一个坑:单细胞数据的h5ad格式转换成R可读取对象 ,其中的数据就是h5ad格式:https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE222427
# 导入scanpy库 import scanpy as sc# 读取 adata = sc.read_h5ad("./GSE222427/GSM6923183_MC_scRNA.h5ad" ) adata adata.var.head()
结果如下:
扩展 以上所有的读取函数都来自 scanpy 这个 python 包,更多的读取方法见:https://scanpy.readthedocs.io/en/1.11.x/api/reading.html,相信通过上面的代码模仿,大家很快就可以学会~
分享到此,你开始学习python了吗? 文末友情宣传