2017-06-30 32 views
0

我有一系列代謝物在系統各個隔室中存在的數據。我也有關於每種代謝物是什麼類型的信息。我想要一個頻率表,顯示每個隔室中每種類型代謝物的數量。該數據是這個樣子:基於多個交叉表的熊貓頻率表

df = pd.DataFrame({'met_id':['met_a','met_b','met_c','met_d','met_e','met_f'], 
        'met_type':['amino_acid','amino_acid','lipid','lipid','peptide','peptide'], 
        'comp_1':[True,False,True,True,False,True], 
        'comp_2':[False,True,True,False,True,True]}) 
print df 

comp_1 comp_2 met_id met_type 
0 True False met_a amino_acid 
1 False True met_b amino_acid 
2 True True met_c  lipid 
3 True False met_d  lipid 
4 False True met_e  peptide 
5 True True met_f  peptide 

我想這樣的一個彙總表(或數據幀):

met_type  comp_1 comp_2 
amino_acid 1  1 
lipid   2  1 
peptide  1  2 

表明有多少每個類型的代謝物是在每個隔間。我可以用交叉從而得到數:

pd.crosstab(df_test.met_type,df_test.comp_1)[True] 

met_type 
amino_acid 1 
lipid   2 
peptide  1 
Name: True, dtype: int64 

,我想我可以連接每一個系列的,但有一個整潔的方式來創建計數所有的表隔間列?

回答

1

您可以使用groupby意味着

df = pd.DataFrame({'met_id': 
['met_a','met_b','met_c','met_d','met_e','met_f'], 
       'met_type': 
['amino_acid','amino_acid','lipid','lipid','peptide','peptide'], 
        'comp_1':[True,False,True,True,False,True], 
        'comp_2':[False,True,True,False,True,True]}) 
dfn = df.groupby("met_type").mean() 
dfn = dfn[['comp_1','comp_2']]*2 

這會給你的彙總表

 
      comp_1 comp_2 
met_type     
amino_acid  1.0  1.0 
lipid   2.0  1.0 
peptide  1.0  2.0 

正如你建議我們可以用總和(仍然是一個初學者到時候:))

dfn = df.groupby("met_type")['comp_1','comp_2'].sum().astype(int) 
 
      comp_1 comp_2 
met_type     
amino_acid  1  1 
lipid   2  1 
peptide   1  2 
+0

嗯,這對m y玩具的例子,但在我的真實數據集'comp_1'和'comp_2'是布爾類型,所以我得到一個錯誤'DataError:沒有數字類型來聚合'。我會編輯我的問題以清楚地說明 - 布爾類型有沒有類似的方法? –

+0

你可以顯示真實的數據集 – Dark

+1

對不起,實際上我認爲問題是布爾列表中有NaN打破你的答案。爲了總結的目的,我可以用False替換NaN,它的效果非常好!我會接受你的答案並轉換NaN。 –