Python 基于多交叉表的pandas频率表

Python 基于多交叉表的pandas频率表,python,pandas,boolean,crosstab,Python,Pandas,Boolean,Crosstab,我有数据表明在一个系统的不同部分中存在一组代谢物。我也有关于每种代谢物类型的信息。我想要一个频率表,显示每个隔室中每种类型的代谢物的数量。数据如下所示: 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'],

我有数据表明在一个系统的不同部分中存在一组代谢物。我也有关于每种代谢物类型的信息。我想要一个频率表,显示每个隔室中每种类型的代谢物的数量。数据如下所示:

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
met_type      comp_1 comp_2
amino_acid    1      1
lipid         2      1
peptide       1      2
给予

我想要一个汇总表或数据框,如下所示:

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
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]
给予

我想我可以连接这些系列中的每一个,但是有没有一种简洁的方法来创建一个包含所有隔室列计数的表呢?

您可以使用groupby mean

这将为您提供汇总表

comp_1 comp_2 met_type amino_acid 1.0 1.0 lipid 2.0 1.0 peptide 1.0 2.0
啊,这适用于我的玩具示例,但在我的真实数据集中,“comp_1”和“comp_2”是布尔类型,因此我得到一个错误DataError:没有要聚合的数值类型。我将对我的问题进行编辑,以澄清这一点-布尔值是否有类似的方法?对不起,事实上我认为问题在于布尔值列表中存在打破答案的“N”。为了总结的目的,我可以用FALSE替换NAN,它非常有效!我会接受你的答案并转换成NaN。为了让它更一般,我将.mean替换为.sum,这也删除了你答案最后一行的要求。为了可读性,我应用了dfn=dfn.astype'int',因为它们是计数。 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