根据另一个数据集中的元素位置快速筛选数据帧的方法

2024-09-30 22:22:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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分钟。我想为多个数据集运行这段代码。所以我想知道是否有一种更优雅、更快的方法来实现同样的目标

编辑:添加了用于再现性的随机种子,并添加了一个修复程序以获得正确的组名


Tags: columns数据appdfvaluesgeneg0serpinh1
2条回答

我希望避免循环以加快进程。因此,我们将这三个数据帧重新组合成一个长格式。在新的数据框中将它们组合在一起,并聚合最小p值。用获得的基因名称和P值提取一个新的数据框。与您的逻辑不同的是提取组名的时间。与P值对应的组名从一开始就获得。如果这种方法是错误的,我们只能帮助您部分加快流程。谢谢你的理解

g0 = pd.concat([names['g0'],pvalues['g0'],foldchanges['g0']],axis=1)
g0.columns = ['names','pvalues','foldchanges']
g0['group'] = 'g0'

g1 = pd.concat([names['g1'],pvalues['g1'],foldchanges['g1']],axis=1)
g1.columns = ['names','pvalues','foldchanges']
g1['group'] = 'g1'

g2 = pd.concat([names['g2'],pvalues['g2'],foldchanges['g2']],axis=1)
g2.columns = ['names','pvalues','foldchanges']
g2['group'] = 'g2'

g3 = pd.concat([names['g3'],pvalues['g3'],foldchanges['g3']],axis=1)
g3.columns = ['names','pvalues','foldchanges']
g3['group'] = 'g3'

all_df = pd.concat([g0, g1, g2, g3], axis=0)

gb = all_df.groupby('names')['pvalues'].agg('min').reset_index()
all_df[(all_df['names'].isin(gb['names'])) & (all_df['pvalues'].isin(gb['pvalues']))]

    names   pvalues foldchanges group
1   Hspg2   0.004153    59.926384   g1
3   Serpinh1    0.007515    30.217304   g1
5   Lgr5    0.003352    15.884651   g1
7   Slc6a6  0.003947    99.277559   g1
8   Tpm1    0.000299    36.480099   g1
3   Fxyd3   0.000485    0.583842    g2
6   App   0.000566  23.006282   g2
0   Apoe    0.003422    11.763652   g3
1   Ltbp3   0.003203    25.222484   g3
9   Krt15   0.005134    80.433481   g3

在dataframe的主体中包含所有相关数据是非常重要的,从这个意义上说,melt()函数是组织数据的重要盟友

df_melted = pd.melt(pvalues, var_name="group", value_name="pvalues")
df_melted['foldchanges'] = pd.melt(foldchanges, var_name="group", value_name="foldchanges")['foldchanges']
df_melted['gene'] = pd.melt(names, var_name="group", value_name="gene")['gene']

现在,您可以简单地进行一些基本分组,以获得具有最小pvalues的索引

min_idx = df_melted.groupby(by=["gene"])["pvalues"].idxmin()
out_df = df_melted.iloc[min_idx]

使用某些格式以获得所需格式的输出

out_df = out_df.set_index('gene').rename_axis(None)[['pvalues', 'foldchanges', 'group']]

你可以走了

           pvalues  foldchanges group
Apoe      0.004237    66.676672    g0
App       0.001434    82.099323    g2
Fxyd3     0.000710    20.887676    g2
Hspg2     0.004376    21.038256    g2
Krt15     0.006121    28.280696    g0
Lgr5      0.004562    97.676109    g0
Ltbp3     0.000202    65.310833    g0
Serpinh1  0.005218    83.794491    g0
Slc6a6    0.001183    19.658236    g0
Tpm1      0.000188    73.926358    g2

相关问题 更多 >