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

2024-06-28 19:42:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个叫做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 Index values是将resulttable导出到csv文件时数据帧的索引,Cybi_标记值作为标记号添加到数据帧中,以对标记进行分组。标记列包含数据来自的文件名。在

我的目标是计算df索引中每个Cybi_标记的强度和常模强度值的平均值、标准值和CV值。因此,例如,对于df Index 114,Cybi_Tag 17,我想将1013.328-ish值(So C09.xls、C10.xls、D09.xls、D10.xls)分组,然后求出强度和标准强度值的平均值。

我想要的表格应该是:

^{pr2}$

对于上表

我尝试在df Index和Cybi_Tag上使用groupby:

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

或者

resulttable_calc = resulttable.groupby['Cybi_Tag']

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

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

上面的代码只按df索引分组,因此它将Exp.m/z分组,而不考虑标记值。在


Tags: 数据标记dfindextagxlsgroupby强度
1条回答
网友
1楼 · 发布于 2024-06-28 19:42:32

我认为您需要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,请使用:

^{pr2}$

然后通过map在列中使用remove 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

相关问题 更多 >