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

时间:2017-06-30 14:53:33

标签: 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'],
                   '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

我想要一个这样的摘要表(或DataFrame):

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 个答案:

答案 0 :(得分: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

如你所示,我们可以使用sum(当时还是初学者:))

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
相关问题