python - 在 groupby 内分组,然后取平均值

标签 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 标签。感谢您提供的任何帮助!

最佳答案

在你第一次 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')]

关于python - 在 groupby 内分组,然后取平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54813305/

相关文章:

python - 了解 Keras 模型的形状

Python3、Gtk3、调整值随机变化

python - 在 swagger python 服务器 stub 处将 token 授权装饰器添加到端点的任何解决方法

python - 在 Tensorflow 中使用 3d 转置卷积进行上采样

python - 将 python pandas DataFrame 转换为 R dataframe 以与 rpy2 一起使用的问题

pandas - 检查是否在 pandas 数据框中的列列表中找到了组 ID 或元素

python - Pandas 数据框 : create new columns of labels based on other columns

python - Pandas 分类没有按预期工作

python - 获取频率最大的类(python)

python - Pandas 的 SQL 等价物 [df.groupby(...) ['col_name' ].shift(1)]