Py学习  »  Python

python版读取不同的单细胞数据格式(单样本与多样本)

单细胞天地 • 4 月前 • 155 次点击  

关于 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 pd
import scanpy as sc
import 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 pd
import scanpy as sc
import os
import 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 sc
import os
import 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了吗?

文末友情宣传

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/179636
 
155 次点击