Как использовать groupby в pandas dataframe, чтобы получить среднее значение для следующих данных? - PullRequest
0 голосов
/ 06 июня 2018

У меня есть следующие данные, значения в кадре данных - это величины, а «красный», «желтый», «зеленый» - это категории

items  place     red     green   yellow  
a      VA         1       7       9
b      VA         3       0       19
c      VA         5       1        0
d      VA         11      3        4
e      VA         2       2        1
a      NJ         0       0        3
b      NJ         3       0        9
c      NJ         2       4        0
d      NJ         0       5        6
e      NJ         2       7        1
a      MO         0       0        5
b      MO         1       0        4
c      MO         1       4        0
d      MO         0       0        5
e      MO         1       7        1

ДляЯ хотел бы рассчитать среднее значение этих величин по всем 5 пунктам (a, b, c, d, e),

category  place  Avg_quantity
red        VA     ..
green      VA .   ..
yellow     VA     ..
 red       NJ     ..
green      NJ     ..
yellow     NJ     ..
 red       MO     ..
green      MO     ..
yellow     MO     ..
для каждой комбинации мест / категорий.

Ответы [ 3 ]

0 голосов
/ 06 июня 2018

Вам необходимо stack данные, а затем groupby их, чтобы найти mean.

data = df.set_index(['items', 'place']).stack().rename_axis(['items', 'place', 'category']).reset_index(name='value')
data.groupby(['category', 'place'])['value'].mean().reset_index(name='avg_quantity')

Вывод:

     category place avg_quantity
0    green    MO    2.2
1    green    NJ    3.2
2    green    VA    2.6
3      red    MO    0.6
4      red    NJ    1.4
5      red    VA    4.4
6   yellow    MO    3.0
7   yellow    NJ    3.8
8   yellow    VA    6.6
0 голосов
/ 06 июня 2018

Вам просто нужно groupby + mean + stack

df.groupby('place').mean().stack().rename_axis(['name', 'color']).to_frame('avg').reset_index()

Выходы

  place   color  avg
0    MO     red  0.6
1    MO   green  2.2
2    MO  yellow  3.0
3    NJ     red  1.4
4    NJ   green  3.2
5    NJ  yellow  3.8
6    VA     red  4.4
7    VA   green  2.6
8    VA  yellow  6.6
0 голосов
/ 06 июня 2018

Вы можете сделать groupby mean тогда melt

df.groupby('place')[['red','green','yellow']].mean().reset_index().melt('place')
Out[576]: 
  place variable  value
0    MO      red    0.6
1    NJ      red    1.4
2    VA      red    4.4
3    MO    green    2.2
4    NJ    green    3.2
5    VA    green    2.6
6    MO   yellow    3.0
7    NJ   yellow    3.8
8    VA   yellow    6.6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...