Панды: сортировка и удаление строк из сгруппированного кадра данных - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть фрейм данных:

import pandas as pd
df = pd.read_csv('test.csv')

   brand  rating
0      a      81
1      a      83
2      a      60
3      a      45
4      b      73
5      b      55
6      b      90
7      c      60
8      d      70
9      e      75
10     e      80
11     e      85

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

groupeddf = df.groupby('brand', as_index=False).agg(['count', 'mean'])

который выдает:

      rating           
       count       mean
brand                  
a          4  67.250000
b          3  72.666667
c          1  60.000000
d          1  70.000000
e          3  80.000000

Теперь я хотел бы отсортировать эти результаты по среднему значению и отбросить все бренды, для которых существует менее трех (поэтому в этом случае отбросим строки для C и D).

Я пытался отсортировать по «среднему значению»:

groupeddf.sort_values('mean')

, но я получил KeyError: 'mean'

Итак, я посмотрел на свои столбцы:

groupeddf.columns

, что дает:

MultiIndex(levels=[['rating'], ['count', 'mean']],
       labels=[[0, 0], [0, 1]])

И теперь я не совсем уверен, что делать.Все, что я хочу сделать, это:

  • сгруппировать мой исходный кадр данных по бренду
  • вычислить среднее значение и количество для каждого бренда
  • отсортировать по среднему значению в порядке убывания
  • исключить любые данные, где количество <3 </li>

1 Ответ

0 голосов
/ 28 сентября 2018

Вы можете использовать клавишу tuple для индексирования MultiIndex вашего Фрейма данных:

s = df.groupby('brand').agg(['count', 'mean'])

s[s[('rating', 'count')] >= 3].sort_values(by=('rating', 'mean'))

      rating
       count       mean
brand
a          4  67.250000
b          3  72.666667
e          3  80.000000

Если вы хотите избежать созданияMultiIndex во-первых, agg на вашем Series вместо всего DataFrame:

s = df.groupby('brand').rating.agg(['count', 'mean'])

       count       mean
brand
a          4  67.250000
b          3  72.666667
c          1  60.000000
d          1  70.000000
e          3  80.000000

Теперь индексирование стало проще:

s[s['count'] >= 3].sort_values(by='mean')

       count       mean
brand
a          4  67.250000
b          3  72.666667
e          3  80.000000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...