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