python pandas使用groupby使用两个条件/列

时间:2017-06-19 07:50:10

标签: python pandas dataframe

我有一个名为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,无论标签值如何。

1 个答案:

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