scanpy合并多个adata数据集和根据条件进行随机抽取细胞

这篇博客介绍了如何使用scanpy库来处理单细胞RNA测序数据。首先,从DataFrame加载rna_counts数据并构建AnnData对象。接着,添加了数据集的分组信息。然后,演示了如何合并多个AnnData对象成一个大的数据集。最后,讨论了如何依据'batch'分组进行等比例和不等比的随机抽样操作,以便于后续分析。
import pandas as pd ; import numpy as np ; from scipy import sparse
import scanpy as sc
import anndata as ad
import os

加载datafram格式的rna_counts数据集构建AnnData

X = pd.read_csv(r'./1.rnacounts.tsv', sep = '\t').transpose()
X = sparse.csr_matrix(X)
ad_1 = ad.AnnData(X = X.values, obs = pd.DataFrame(index = X.index), var = pd.DataFrame(index = X.columns))
ad_1.var_names_make_unique()
ad_1.obs_names_make_unique()
X = pd.read_csv(r'./2.rnacounts.tsv', sep = '\t').transpose()
X = sparse.csr_matrix(X)
ad_2 = ad.AnnData(X = X.values, obs = pd.DataFrame(index = X.index), var = pd.DataFrame(index = X.columns))
ad_2.var_names_make_unique()
ad_2.obs_names_make_unique()
X = pd.read_csv(r'./3.rnacounts.tsv', sep = '\t').transpose()
X = sparse.csr_matrix(X)
ad_3 = ad.AnnData(X = X.values, obs = pd.DataFrame(index = X.index), var = pd.DataFrame(index = X.columns))
ad_3.var_names_make_unique()
ad_3.obs_names_make_unique()

添加数据集的分组信息

ad_1.obs["batch"] = "batch_1"
ad_2.obs["batch"] = "batch_2"
ad_3.obs["batch"] = "batch_3"
print("ad_1:::",ad_1.shape,"\nad_2:::",ad_2.shape,"\nad_3:::",ad_3.shape)

合并多个AnnData对象为一个数据集

adList= [ad_1,ad_2,ad_3]
#ad_all =ad.concat(adList,join='outer') #合并同R语言Seurat的merge(scRNAList[[1]],scRNAList[2:length(scRNAList)])
ad_all = sc.AnnData.concatenate(*scRNAList,join='outer')
ad_all.var_names_make_unique()
ad_all.obs_names_make_unique()
sc.pp.calculate_qc_metrics(ad_all, percent_top=None,log1p=False,inplace=True) #counts统计

根据batch分组进行等比例抽取数据

N = 1000 #每组抽1000细胞
ad_tmp = ad_all[ad_all.obs.groupby("batch").sample(n = N, random_state=123,replace=False).index].copy
frac = 0.5 #每组抽50%的细胞
ad_tmp = ad_all[ad_all.obs.groupby("batch").sample(frac = frac, random_state=123,replace=False).index].copy

根据batch列的信息进行分层不等比采样

adList=[]
groups = ad_all.obs.groupby("batch").size()
for batch in group.index:
    i = groups [batch]
    frc = i / ad_all.obs.groupby("batch").size().sum()
    N = int(round(frc*1000,0)) #总采取1000细胞,分层不等比抽取
    _index = ad_all.obs[ ad_all.obs["batch"] == batch ].sample(n = N, random_state=123,replace=False).index
    ad_tmp = ad_all[_index].copy()
    adList.append(ad_tmp)
#ad_sub =ad.concat(adList,join='outer')
ad_sub = sc.AnnData.concatenate(*adList,join='outer')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倪桦

有帮助的话请杯咖啡吧,谢谢!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值