分组,然后平均

时间:2019-02-21 17:52:25

标签: python pandas pandas-groupby

假设我有一个数据帧(我将仅使用一个简单的示例),如下所示:

import pandas as pd

df = {'Col1':[3,4,2,6,5,7,3,4,9,7,1,3],
      'Col2':['B','B','B','B','A','A','A','A','C','C','C','C',], 
      'Col3':[1,1,2,2,1,1,2,2,1,1,2,2]}

df = pd.DataFrame(df)

哪个给出这样的数据框:

    Col1 Col2  Col3
0      3    B     1
1      4    B     1
2      2    B     2
3      6    B     2
4      5    A     1
5      7    A     1
6      3    A     2
7      4    A     2
8      9    C     1
9      7    C     1
10     1    C     2
11     3    C     2 

我要做的是几个步骤:

1)对于Col2中的每个唯一值以及Col3中的每个唯一值,取平均Col1。因此,期望的输出将是:

         Avg   Col2  Col3
    1    3.5    B     1
    2      4    B     2
    3      6    A     1
    4    3.5    A     2
    5      8    C     1
    6      2    C     2 

2)现在,对于Col3中的每个唯一值,我想要最高平均值和Col2中的相应值。所以

     Best Avg   Col2  Col3
    1      8    C     1
    2      4    B     2

我尝试使用df.groupby(['Col3','Col2'], as_index = False).agg({'Col1':'mean'}).groupby(['Col3']).agg({'Col1':'max'})

这给了我每个Col3值的最高平均值,但没有对应的Col2标签。谢谢您能提供的任何帮助!

2 个答案:

答案 0 :(得分:2)

首先groupbysort_values + drop_duplicates

g1=df.groupby(['Col3','Col2'], as_index = False).agg({'Col1':'mean'})
g1.sort_values('Col1').drop_duplicates('Col3',keep='last')
Out[569]: 
   Col3 Col2  Col1
4     2    B   4.0
2     1    C   8.0

或者如果您的均值最大值重复

g1[g1.Col1==g1.groupby('Col3').Col1.transform('max')]

答案 1 :(得分:1)

执行以下操作(我对您的代码做了一些修改, 将其缩短一点):

df2 = df.groupby(['Col3','Col2'], as_index = False).mean()

打印结果时,输入以下内容即可:

   Col3 Col2  Col1
0     1    A   6.0
1     1    B   3.5
2     1    C   8.0
3     2    A   3.5
4     2    B   4.0
5     2    C   2.0

然后运行:

res = df2.iloc[df2.groupby('Col3').Col1.idxmax()]

打印结果时,您将得到:

   Col3 Col2  Col1
2     1    C   8.0
4     2    B   4.0

如您所见:

  • idxmax给出具有“最大”元素的行的索引(对于每个 组),
  • 您可以将此结果用作iloc的参数。