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