我有一个名为resulttable的df,如下所示:
df Index Cybi_Tag Tag Exp. m/z Intensity Norm_Intensity
114 17 C09.xls 1013.328 1000 0.5
114 17 C10.xls 1013.325 1100 0.6
114 17 D09.xls 1013.33 1200 0.7
114 17 D10.xls 1013.331 1300 0.8
114 18 C11.xls 1013.328 2000 0.9
114 18 C12.xls 1013.326 2100 1.0
114 18 D11.xls 1013.326 2200 1.1
114 18 D12.xls 1013.328 2300 1.2
180 17 C09.xls 1079.47 3000 1.3
180 17 D09.xls 1079.432 3200 1.5
180 17 D10.xls 1079.446 3300 1.6
180 18 C11.xls 1079.452 4000 1.7
180 18 C12.xls 1079.442 4100 1.8
其中df索引值是将结果表导出到csv文件时数据帧的索引,并且将Cybi_Tag值作为标记号添加到数据帧以对标记进行分组。标记列包含数据来自的文件的名称。
我的目标是计算df Index中每个Cybi_Tag的Intensity和Norm_Intensity值的mean,std和CV。所以,例如,对于df Index 114,Cybi_Tag 17,我想将1013.328-ish值分组(所以C09.xls,C10.xls,D09.xls,D10.xls),并找到Intensity和Norm_Intensity值的平均值
我想要的表应该是这样的:
df Index Cybi_Tag Exp. m/z Intensity Norm_Intensity
114 17 1013.329 1150 0.65
114 18 1013.327 2150 1.05
180 17 1079.449 3167 1.467
180 18 1079.455 4050 1.75
所以对于上表,
我尝试通过以下方式对df Index和Cybi_Tag进行groupby:
resulttable_calc = resulttable.groupby(level=0)['Cybi_Tag']
或
resulttable_calc = resulttable.groupby['Cybi_Tag']
但是,第一个代码生成了一个错误消息:未找到列:Cybi_Tag。第二个代码不会产生错误,但它会对整个Cybi_Tag进行分组,因此它会为所有Exp分组C09,C10,D09,D10。 m / z值,所以我最后留下了两行,这不是我想要的。
resulttable_calc = resulttable.groupby(level= 0&1)
上面的代码只按df索引分组,因此它将Exp分组。 m / z,无论标签值如何。
答案 0 :(得分:2)
我认为您需要list
级别,
:
#specify order of MultiIndex levels
resulttable_calc = resulttable.groupby(level=[0,1])
#specify name of MultiIndex levels
resulttable_calc = resulttable.groupby(level=['df Index','Cybi_Tag'])
如果可以使用最后一个版本的pandas:
#same as specify columns names
resulttable_calc = resulttable.groupby(['df Index','Cybi_Tag'])
然后通过map
列中的列移除MultiIndex进行汇总:
resulttable_calc = resulttable.groupby(level=[0,1])
.agg({'Intensity':['mean','std'], 'Exp. m/z': 'mean'})
print (resulttable_calc)
Exp. m/z Intensity
mean mean std
df Index Cybi_Tag
114 17 1013.328500 1150.000000 129.099445
18 1013.327000 2150.000000 129.099445
180 17 1079.449333 3166.666667 152.752523
18 1079.447000 4050.000000 70.710678
resulttable_calc.columns = resulttable_calc.columns.map('_'.join)
d = {'Intensity_mean':'Average','Exp. m/z_mean':'Exp. m/z', 'Intensity_std':'Norm_Intensity'}
resulttable_calc = resulttable_calc.rename(columns=d).reset_index()
print (resulttable_calc)
df Index Cybi_Tag Exp. m/z Average Norm_Intensity
0 114 17 1013.328500 1150.000000 129.099445
1 114 18 1013.327000 2150.000000 129.099445
2 180 17 1079.449333 3166.666667 152.752523
3 180 18 1079.447000 4050.000000 70.710678