2017-05-04 74 views
1

比方說,我有這樣的數據框命名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行,這將是

平均值([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 

我一直在想這一段時間,但我堅持。我需要使用熊貓函數isin()或什麼?

回答

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