Группировать по группам, затем усреднять - PullRequest
0 голосов
/ 21 февраля 2019

Допустим, у меня есть фрейм данных (я просто воспользуюсь простым примером), который выглядит следующим образом:

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 голосов
/ 21 февраля 2019

Сделайте следующее (я немного изменил ваш код, чтобы сделать его немного короче):

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.
0 голосов
/ 21 февраля 2019

После того, как вы сначала 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')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...