我正在使用3个数据框,其中包含关于多个细胞组差异基因表达的信息。它本质上是一个多维数据帧,其中一个数据帧(名称)是在p值和foldchange数据帧中查找对应值的位置的索引
columns = ['g0','g1','g2','g3']
names = pd.DataFrame(data = [
['Fxyd3', 'Apoe', 'Apoe', 'Apoe'],
['Apoe', 'Hspg2', 'Hspg2', 'Ltbp3'],
['Tpm1', 'Ltbp3', 'Ltbp3', 'Hspg2'],
['App', 'Serpinh1', 'Fxyd3', 'Fxyd3'],
['Ltbp3', 'Fxyd3', 'Serpinh1', 'Lgr5'],
['Hspg2', 'Lgr5', 'Lgr5', 'App'],
['Slc6a6', 'App', 'App', 'Serpinh1'],
['Serpinh1', 'Slc6a6', 'Slc6a6', 'Slc6a6'],
['Lgr5', 'Tpm1', 'Tpm1', 'Tpm1'],
['Krt15', 'Krt15', 'Krt15', 'Krt15']],
columns = columns)
np.random.seed(0)
pvalues = pd.DataFrame(data = np.random.rand(10,4)/100, columns = columns)
foldchanges = pd.DataFrame(data =np.random.rand(10,4)*100, columns = columns)
我想做的是找到每个基因的最小p值以及相应的foldchange和group name。经过数小时的思考,我终于找到了解决方案:
gene_set = ['Hspg2', 'Ltbp3', 'Lgr5', 'Krt15', 'Serpinh1', 'Tpm1', 'App', 'Apoe', 'Slc6a6', 'Fxyd3']
df = pd.DataFrame(index = gene_set, columns = ['pvalues', 'foldchanges', 'group'], data = 0)
for gene in gene_set:
bool_df = names.values == gene
values = pvalues.values[bool_df]
df['pvalues'].loc[gene] = min(values)
df['foldchanges'].loc[gene] = foldchanges.values[bool_df][values==min(values)]
values = pvalues.T.values[bool_df.T] #Fix to get out correct group name
df['group'].loc[gene] = columns[np.where(values==min(values))[0][0]]
产生如下输出:
pvalues foldchanges group
Hspg2 0.004376 21.038256 g2
Ltbp3 0.000202 65.310833 g0
Lgr5 0.004562 97.676109 g0
Krt15 0.006121 28.280696 g0
Serpinh1 0.005218 83.794491 g0
Tpm1 0.000188 73.926358 g2
App 0.001434 82.099323 g2
Apoe 0.004237 66.676672 g0
Slc6a6 0.001183 19.658236 g0
Fxyd3 0.000710 20.887676 g2
现在,我的问题是,在完整的数据集中,我有20多个组和大约50000个基因,最终运行大约需要15-20分钟。我想为多个数据集运行这段代码。所以我想知道是否有一种更优雅、更快的方法来实现同样的目标
编辑:添加了用于再现性的随机种子,并添加了一个修复程序以获得正确的组名
我希望避免循环以加快进程。因此,我们将这三个数据帧重新组合成一个长格式。在新的数据框中将它们组合在一起,并聚合最小p值。用获得的基因名称和P值提取一个新的数据框。与您的逻辑不同的是提取组名的时间。与P值对应的组名从一开始就获得。如果这种方法是错误的,我们只能帮助您部分加快流程。谢谢你的理解
在dataframe的主体中包含所有相关数据是非常重要的,从这个意义上说,
melt()
函数是组织数据的重要盟友现在,您可以简单地进行一些基本分组,以获得具有最小
pvalues
的索引使用某些格式以获得所需格式的输出
你可以走了
相关问题 更多 >
编程相关推荐