2017-06-19 81 views
2

我有一个DF称为resulttable,看起来像:蟒蛇熊猫使用GROUPBY使用两个标准/列

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指数值均为当resulttable导出为CSV文件中的数据帧的指数,和Cybi_Tag值作为标记号被添加到数据框以对标记进行分组。标记列包含数据来自的文件的名称。

我的目标是计算df指数中每个Cybi_Tag的Intensity和Norm_Intensity值的平均值,标准偏差和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指数和Cybi_Tag GROUPBY:

resulttable_calc = resulttable.groupby(level=0)['Cybi_Tag'] 

resulttable_calc = resulttable.groupby['Cybi_Tag'] 

但是,第一个代码会发出Column not found的错误消息:Cybi_Tag。第二个代码不会产生错误,但会将整个Cybi_Tag分组,因此它将所有Exp分组为C09,C10,D09,D10。 m/z值,所以我在最后留下两行,这不是我想要的。

resulttable_calc = resulttable.groupby(level= 0&1) 

上面的代码只按df指数分组,所以它将Exp分组。 m/z,而不管标签值如何。

回答

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']) 

如果大熊猫的使用最后一个版本是可能的用途:

#same as specify columns names 
resulttable_calc = resulttable.groupby(['df Index','Cybi_Tag']) 

然后汇总与map删除多指标列:

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 
+0

再次感谢你Jez !.我实际上是从网上的一张熊猫备忘单中发现的,我需要'level = [0,1]'来分组多列。 –

+0

是的,很高兴可以提供帮助。这个问题是简单的,但以前是非常复杂的;) – jezrael

+0

是的我想我应该把我的问题分解成片断,因为我也困惑自己以及 –