Python-Merge多个Scanpy-Adata对象和细胞降采样实现

简介: 本分简单分享在Python中操着合并Adata对象,和细胞降采样的实现方法
import pandas as pd ; import numpy as np ; from scipy import sparse
import scanpy as sc
import anndata as ad
import os

1、加载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()

2、添加数据集的分组信息

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)

3、合并多个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统计

4、根据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

5、根据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')
目录
相关文章
|
3月前
|
Python
python对象模型
这篇文章介绍了Python中的对象模型,包括各种内置对象类型如数字、字符串、列表、字典等,以及如何使用`type()`函数来查看变量的数据类型。
|
3月前
|
Python
探索Python中的魔法方法:打造你自己的自定义对象
【8月更文挑战第29天】在Python的世界里,魔法方法如同神秘的咒语,它们赋予了对象超常的能力。本文将带你一探究竟,学习如何通过魔法方法来定制你的对象行为,让你的代码更具魔力。
43 5
|
1月前
|
存储 缓存 Java
深度解密 Python 虚拟机的执行环境:栈帧对象
深度解密 Python 虚拟机的执行环境:栈帧对象
60 13
|
1月前
|
索引 Python
Python 对象的行为是怎么区分的?
Python 对象的行为是怎么区分的?
24 3
|
1月前
|
存储 缓存 算法
详解 PyTypeObject,Python 类型对象的载体
详解 PyTypeObject,Python 类型对象的载体
31 3
|
1月前
|
Python
深入解析 Python 中的对象创建与初始化:__new__ 与 __init__ 方法
深入解析 Python 中的对象创建与初始化:__new__ 与 __init__ 方法
19 1
|
1月前
|
缓存 Java 程序员
一个 Python 对象会在何时被销毁?
一个 Python 对象会在何时被销毁?
36 2
|
1月前
|
API Python 容器
再探泛型 API,感受 Python 对象的设计哲学
再探泛型 API,感受 Python 对象的设计哲学
20 2
|
1月前
|
API Python
当调用一个 Python 对象时,背后都经历了哪些过程?
当调用一个 Python 对象时,背后都经历了哪些过程?
22 2
|
1月前
|
存储 API C语言
当创建一个 Python 对象时,背后都经历了哪些过程?
当创建一个 Python 对象时,背后都经历了哪些过程?
19 2