2016-01-21 215 views
0

我有一個看起來像這兩CSV數據的分組平均數據框架柱:如何基於另一個數據框

gene,stem1,stem2,stem3,b1,b2,b3,t1 
foo,20,10,11,23,22,79,3 
bar,17,13,505,12,13,88,1 
qui,17,13,5,12,13,88,3 

而且這樣的:

celltype,phenotype 
SC,stem1 
BC,b2 
SC,stem2 
SC,stem3 
BC,b1 
TC,t1 
BC,b3 

數據幀這個樣子的:

In [5]: import pandas as pd 
In [7]: main_df = pd.read_table("http://dpaste.com/2MRRRM3.txt", sep=",") 

In [8]: main_df 
Out[8]: 
     gene stem1 stem2 stem3 b1 b2 b3 t1 
    0 foo  20  10  11 23 22 79 3 
    1 bar  17  13 505 12 13 88 1 
    2 qui  17  13  5 12 13 88 3 


In [11]: source_df = pd.read_table("http://dpaste.com/091PNE5.txt", sep=",") 

In [12]: source_df 
Out[12]: 
    celltype phenotype 
0  SC  stem1 
1  BC  b2 
2  SC  stem2 
3  SC  stem3 
4  BC  b1 
5  TC  t1 
6  BC  b3 

我想要做的是基於分組在main_df以平均每列在source_df。所以最終看起來像這樣:

 SC    BC    TC 
foo (20+10+11)/3  (23+22+79)/3  3/1 
bar (17+13+505)/3 (12+13+88)/3  1/1 
qui (17+13+5)/3  (12+13+88)/3  3/1 

我該如何做到這一點?

回答

1

你可以轉換source_dfdict和使用.groupby()axis=1應用此main_df

main_df.set_index('gene', inplace=True) 
col_dict = source_df.set_index('phenotype').squeeze().to_dict() 
main_df.groupby(col_dict, axis=1).mean() 

      BC   SC TC 
gene       
foo 41.333333 13.666667 3 
bar 37.666667 178.333333 1 
qui 37.666667 11.666667 3 
1

您可以爲source_df設定指標和main_df然後使用pd.concatgroupby通過celltype

main_df.set_index('gene', inplace=True) 
source_df.set_index("phenotype", inplace=True) 

In [30]: pd.concat([main_df.T, source_df], axis=1) 
Out[30]: 
gene foo bar qui celltype 
b1  23 12 12  BC 
b2  22 13 13  BC 
b3  79 88 88  BC 
stem1 20 17 17  SC 
stem2 10 13 13  SC 
stem3 11 505 5  SC 
t1  3 1 3  TC 


In [33]: pd.concat([main_df.T, source_df], axis=1).groupby(['celltype']).mean().T 
Out[33]: 
celltype   BC   SC TC 
gene 
foo  41.333333 13.666667 3 
bar  37.666667 178.333333 1 
qui  37.666667 11.666667 3 
相關問題