首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据另一个数据集中元素位置过滤熊猫数据的快速方法

根据另一个数据集中元素位置过滤熊猫数据的快速方法
EN

Stack Overflow用户
提问于 2020-08-12 20:26:30
回答 2查看 130关注 0票数 2

我正在与3只熊猫的数据一起工作,这些数据包含关于多个细胞群差异基因表达的信息。它本质上是一个多维数据,其中一个数据(名称)是在p值中查找的索引,以及对应值的折叠式数据格式。

代码语言:javascript
复制
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值,以及相应的折叠和组名。经过数小时的努力,我终于找到了这样的解决方案:

代码语言:javascript
复制
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]]

产生这样的输出:

代码语言:javascript
复制
           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分钟才能运行。我想为多个数据集运行这个代码。所以,我想知道是否有一个更优雅和更快的方式来实现同样的目标?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-13 01:56:53

数据体中必须有所有相关数据,从这个意义上说,melt()函数是组织数据的重要盟友。

代码语言:javascript
复制
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的索引。

代码语言:javascript
复制
min_idx = df_melted.groupby(by=["gene"])["pvalues"].idxmin()
out_df = df_melted.iloc[min_idx]

一些格式以获得所需格式的输出。

代码语言:javascript
复制
out_df = out_df.set_index('gene').rename_axis(None)[['pvalues', 'foldchanges', 'group']]

你可以走了

代码语言:javascript
复制
           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
票数 2
EN

Stack Overflow用户

发布于 2020-08-13 03:11:26

我想避免循环来加速这个过程。因此,我们将这三个数据帧重新组合成一个长格式。将它们组合在一个新的数据框架中,并聚合最小p值。提取一个新的数据框架,得到的基因名称和P-值。与您的逻辑不同的是提取组名的时间。与P-值相对应的组名从一开始就得到.如果这种方法是错误的,我们只能部分地帮助您加速这个过程。感谢您的理解。

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63384272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档