我正在与3只熊猫的数据一起工作,这些数据包含关于多个细胞群差异基因表达的信息。它本质上是一个多维数据,其中一个数据(名称)是在p值中查找的索引,以及对应值的折叠式数据格式。
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值,以及相应的折叠和组名。经过数小时的努力,我终于找到了这样的解决方案:
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+组和大约50,000个基因,这最终需要15-20分钟才能运行。我想为多个数据集运行这个代码。所以,我想知道是否有一个更优雅和更快的方式来实现同样的目标?
编辑:为可再现性添加了随机种子,并添加了一个修补程序以获得正确的组名。
发布于 2020-08-13 01:56:53
数据体中必须有所有相关数据,从这个意义上说,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发布于 2020-08-13 03:11:26
我想避免循环来加速这个过程。因此,我们将这三个数据帧重新组合成一个长格式。将它们组合在一个新的数据框架中,并聚合最小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 g3https://stackoverflow.com/questions/63384272
复制相似问题