按组进行分组,然后在每个小组中再次按另一列进行分组,并求平均值。

4
假设我有一个数据框(我将使用一个简单的示例),看起来像这样:
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个回答

2

在你第一次使用groupby之后,进行sort_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

请按照以下步骤操作(我稍微修改了您的代码,使其更加简洁):

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 的参数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接