Вычислить z_score для столбца, сгруппированного другим столбцом

77
6

Предположим, у меня есть DataFrame с столбцами person_id и mean_act, где каждая строка является числовым значением для определенного человека. Я хочу рассчитать zscore для всех значений на уровне человека. То есть, я хочу новый столбец mean_act_person_zscore который вычисляется как zscore of mean_act используя среднее и std zscores только для этого человека (а не для всего набора данных).

Мой первый подход выглядит примерно так:

person_ids = df['person_id'].unique()
for pid in person_ids:
person_df = df[df['person_id'] == pid]
person_df = (person_df['mean_act'] - person_df['mean_act'].mean())/person_df['mean_act'].std()

На каждой итерации он вычисляет правильные выходные серии zscore, но проблема в том, что, поскольку выбор осуществляется по ссылке, а не по значению, исходный df заканчивается без столбца mean_act_person_zscore.

Мысли о том, как это сделать?

спросил(а) 2021-01-25T13:16:50+03:00 4 месяца, 3 недели назад
1
Решение
63

Должно быть прямо:

df['mean_act_person_zscore'] = df.groupby('person_id').mean_act.transform(lambda x: (x - x.mean()) / x.std())

ответил(а) 2021-01-25T13:16:50+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема