2017-06-30 26 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。 –