社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

单细胞天地 • 6 月前 • 210 次点击  

关于 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
 
210 次点击