Рассчитать среднее значение по столбцу после разделения группы - PullRequest
0 голосов
/ 24 октября 2018

У меня есть DataFrame со столбцами a и b, где b содержит значения Y или N, соответствующие True и False.

Я хотел бы сгруппировать по a, а затем для каждой группы получить среднее значение b's (meaning, the number of True`s в группе, деленное на количество строк в этой группе).

What I 'до сих пор получается

data['b'] = data['b'].map({'Y': True, 'N': False})
data.groupby('a', as_index=False)['b'].mean()

Но я думаю, что это не направление ..


Пример данных:

a   b
1   Y
1   Y
1   N
2   Y
2   Y
2   N
2   N

И вывод должен быть

a   avg
1   2/3
2   1/2

Ответы [ 4 ]

0 голосов
/ 24 октября 2018

numpy.bincount

i, a = data['a'].factorize()
b = (data['b'].values == 'Y')

pd.DataFrame(dict(a=a, avg=np.bincount(i, b) / np.bincount(i)))

   a       avg
0  1  0.666667
1  2  0.500000
0 голосов
/ 24 октября 2018

Вы также можете сделать это следующим образом:

df.assign(avg=df.b=='Y').groupby('a')['avg'].mean()

Вывод:

a
1    0.666667
2    0.500000
Name: avg, dtype: float64

Добавить reset_index:

   a       avg
0  1  0.666667
1  2  0.500000
0 голосов
/ 24 октября 2018

Использование crosstab

pd.crosstab(df.a,df.b,normalize='index').Y
Out[336]: 
a
1    0.666667
2    0.500000
Name: Y, dtype: float64
0 голосов
/ 24 октября 2018

Я бы сделал это с groupby и value_counts(normalize=True):

df.groupby('a')['b'].value_counts(normalize=True).unstack(1)['Y']

a
1    0.666667
2    0.500000
Name: Y, dtype: float64

Нет необходимости в преобразовании / замене / карте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...