Pandas 根据均值构建子表

1 投票
1 回答
981 浏览
提问于 2025-04-18 12:41

我有一个数据表,里面有数字和非数字的数据列。这里是它的一部分:

ATG12 Norm     ATG5 Norm    ATG7 Norm    Cancer Stage    
5.55           4.99         8.99         IIA
4.87           5.77         8.88         IIA
5.98           7.88         8.34         IIC

我想按照癌症分期来分组数据,计算每个数字数据列的平均值,并生成一个表格,列出每个癌症分期的平均值;像这样:

Cancer Stage    ATG12 Mean    ATG5 Mean    ATG7 Mean
IIA             5.03          6.20         8.34
IIB             7.45          4.22         7.99
IIIA            5.32          3.85         6.68

我已经搞懂了groupby和mean()这两个函数,可以用下面的方式计算一个列的平均值:

AVG = data.groupby("Cancer Stage")['ATG12 Norm'].mean()

但这样只给我:

Cancer Stage    
IIA             5.03      
IIB             7.45
IIIA            5.32
Name: ATG12 Norm, dtype: float64

我该如何一次性对所有想要的列应用这个过程,并生成一个包含所有结果的数据表呢?抱歉如果这个问题重复了;我找到的关于pandas的相关问题都让我感到困惑。

1 个回答

1

你试过

df.groupby('Cancer Stage').mean()

或者

df.groupby('Cancer Stage')['ATG12 Norm','ATG5 Norm'].mean()

示例数据包含额外的文本列:

import pandas as pd
from StringIO import StringIO

data='''ATG12 Norm     ATG5 Norm    ATG7 Norm    Cancer Stage    Text
5.55           4.99         8.99         IIA    ABC
4.87           5.77         8.88         IIA    ABC
5.98           7.88         8.34         IIC    ABC'''

df = pd.DataFrame.from_csv(StringIO(data), index_col=None, sep='\s{2,}')

print df
print df.groupby('Cancer Stage')['ATG12 Norm','ATG5 Norm'].mean()
print df.groupby('Cancer Stage').mean()

结果:

   ATG12 Norm  ATG5 Norm  ATG7 Norm Cancer Stage Text
0        5.55       4.99       8.99          IIA  ABC
1        4.87       5.77       8.88          IIA  ABC
2        5.98       7.88       8.34          IIC  ABC


              ATG12 Norm  ATG5 Norm
Cancer Stage                       
IIA                 5.21       5.38
IIC                 5.98       7.88


              ATG12 Norm  ATG5 Norm  ATG7 Norm
Cancer Stage                                  
IIA                 5.21       5.38      8.935
IIC                 5.98       7.88      8.340

撰写回答