2012-08-09 68 views
2

我想部分「崩潰」一個DataFrame /矩陣,並保持結構的完整性,只需將濃縮值相加即可。例如,我有:Python熊貓部分坍塌2d矩陣

CHROM  POS  GENE  DESC  JOE  FRED BILLY SUSAN TONY 
10  1442 LOXL4 bad  1  0  0  1  0 
10  335  LOXL4 bad  1  0  0  0  0 
10  3438 LOXL4 good  0  0  1  0  0 
10  4819 PYROXD2 bad  0  1  0  0  0 
10  4829 PYROXD2 bad  0  1  0  1  0 
10  9851 HPS1  good  1  0  0  0  0 

前4列是描述符,最後4列是人/觀察值。最終目標是要計算每個GENE每個人有多少個「好」和「壞」觀察值。因此,我想這一點:

GENE  DESC  JOE  FRED BILLY SUSAN TONY 
LOXL4 bad  2  0  0  1  0 
LOXL4 good  0  0  1  0  0 
PYROXD2 bad  0  2  0  1  0 
HPS1  good  1  0  0  0  0 

下面的代碼摺疊所有個人意見(喬,弗雷德,等等),我怎樣才能讓他們分開?我也想有足夠的靈活性,以適應未來更多的人(保持相同的4個描述符列)

mytable.groupby(['GENE','DESC']).size() 

回答

4

只需使用GROUPBY對象的總方法:

In [156]: df 
Out[156]: 
    CHROM POS  GENE DESC JOE FRED BILLY SUSAN TONY 
0  10 1442 LOXL4 bad 1  0  0  1  0 
1  10 335 LOXL4 bad 1  0  0  0  0 
2  10 3438 LOXL4 good 0  0  1  0  0 
3  10 4819 PYROXD2 bad 0  1  0  0  0 
4  10 4829 PYROXD2 bad 0  1  0  1  0 
5  10 9851  HPS1 good 1  0  0  0  0 

In [157]: grouped = df.groupby(['GENE', 'DESC']) 

In [158]: grouped.agg(np.sum) # agg is a shortcut for aggregate 
Out[158]: 
       CHROM POS JOE FRED BILLY SUSAN TONY 
GENE DESC            
HPS1 good  10 9851 1  0  0  0  0 
LOXL4 bad  20 1777 2  0  0  1  0 
     good  10 3438 0  0  1  0  0 
PYROXD2 bad  20 9648 0  2  0  1  0 

如前所述由Daniel Velkow在評論中,groupby對象具有一些簡單聚合的「內建」方法,如summean,...(類似numpy數組的方法中可用的ufuncs)。所以最後一步可以進一步簡化爲

In [159]: grouped.sum() 
Out[159]: 
       CHROM POS JOE FRED BILLY SUSAN TONY 
GENE DESC            
HPS1 good  10 9851 1  0  0  0  0 
LOXL4 bad  20 1777 2  0  0  1  0 
     good  10 3438 0  0  1  0  0 
PYROXD2 bad  20 9648 0  2  0  1  0 

如果你想在每列不同的操作,根據docs你可以傳遞一個dictaggregate

但是,我發現沒有辦法爲單個列指定函數併爲其他列使用默認值。因此,一個方法是定義自定義聚合函數:

def custom_agg(s, default=np.sum, other={}): 
    if s.name in other.keys(): 
     return other[s.name](s) 
    else: 
     return default(s) 

,比通過傳遞函數和參數傳遞給agg應用它:

In [59]: grouped.agg(custom_agg, default=np.sum, other={'CHROM': np.mean}) 
Out[59]: 
       CHROM POS JOE FRED BILLY SUSAN TONY 
GENE DESC            
HPS1 good  10 9851 1  0  0  0  0 
LOXL4 bad  10 1777 2  0  0  1  0 
     good  10 3438 0  0  1  0  0 
PYROXD2 bad  10 9648 0  2  0  1  0 
+0

的感謝!現在我可以閱讀聚合以及 – alexhli 2012-08-09 17:34:26

+1

另外'grouped.sum()'是'grouped.agg(np.sum)' – 2012-08-10 19:22:24

+0

@DanielVelkov的簡寫你說得對,謝謝,我已經更新了答案。 – bmu 2012-08-11 15:41:18