熊猫 - 匹配的平均值减去每个组中不匹配的平均值



假设我有此数据框架名为main_df

    tf      organs
1   ALX3    brain,heart
2   ARID5A  kidney

并使用此参考数据框,名为ref_df,

    tf      organ   expression
1   ALX3    brain   2
2   ALX3    heart   5
3   ALX3    kidney  4
4   ARID5A  brain   3
5   ARID5A  heart   6
6   ARID5A  kidney  1

我想将列添加到名为delta的main_df中,其中它占用ref_df中的相应值的平均值,并减去该TF的剩余值的均值。因此,在第1行中,它将是

平均值([2,5]( - 平均值([4](= -0.5

在第2行中,它将是

平均值([1]( - 平均值([3,6](= -3.5

现在看起来像这样的main_df:

    tf      organs      delta
1   ALX3    brain,heart -0.5
2   ARID5A  kidney      -3.5

我已经考虑了一段时间了,但是我被困住了。我需要使用pandas函数isin((或其他吗?

步骤1
ref_df变成更易于使用的功能,我将定义

rdf = ref_df.set_index(['tf', 'organ']).expression.unstack()
rdf
organ   brain  heart  kidney
tf                          
ALX3        2      5       4
ARID5A      3      6       1

步骤2
使用split生成器官列表的正均值。使用difference生成负均值的器官列表。

def delta(row):
    p = row.organs.split(',')
    n = rdf.columns.difference(p)
    return rdf.loc[row.tf, p].mean() - rdf.loc[row.tf, n].mean()

步骤3
apply assign用新列

生产新的数据框
main_df.assign(detla=main_df.apply(delta, 1))
       tf       organs  detla
1    ALX3  brain,heart   -0.5
2  ARID5A       kidney   -3.5

最新更新