pandas 频率 table 基于多个交叉表
pandas frequency table based on multiple crosstabs
我有关于系统不同隔间中存在一组代谢物的数据。我也有关于每种代谢物是什么类型的信息。我想要一个频率 table 显示每个隔间中每种类型的代谢物的数量。数据看起来像这样:
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
我想要这样的摘要 table(或 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
我想我可以将这些系列中的每一个串联起来,但是有没有一种巧妙的方法来创建一个 table,其中包含所有隔间列的计数?
你可以用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
这会给你摘要table
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
我有关于系统不同隔间中存在一组代谢物的数据。我也有关于每种代谢物是什么类型的信息。我想要一个频率 table 显示每个隔间中每种类型的代谢物的数量。数据看起来像这样:
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
我想要这样的摘要 table(或 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
我想我可以将这些系列中的每一个串联起来,但是有没有一种巧妙的方法来创建一个 table,其中包含所有隔间列的计数?
你可以用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
这会给你摘要table
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