熊猫 - 比赛的平均值减去每组内不匹配的平均值

时间:2017-05-04 15:11:16

标签: python pandas

假设我的数据框名为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

我想在main_df中添加一个名为delta的列,其中它取ref_df中相应值的平均值,并减去该tf的剩余值的平均值。所以在第1行中,它将是

mean([2,5]) - mean([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 个答案:

答案 0 :(得分:1)

第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