функция в группе pandas - PullRequest
       7

функция в группе pandas

0 голосов
/ 15 апреля 2020

Я хотел бы рассчитать среднее значение «бонуса» по столбцу «first_name», но знаменатель не является суммой наблюдений, потому что не все наблюдения имеют вес 1, а могут иметь вес 0,5.

например, в случае с Джейсоном желаемое значение - это сумма его бонуса, деленная на 2,5.

Так как в реальной жизни мне приходится группировать по нескольким столбцам, таким как area, et c, я бы хотел адаптировать группу к этой ситуации.

Вот моя попытка, но она дает мне нормальное среднее значение


raw_data = {'area': [1,2,3,3,4],'first_name': ['Jason','Jason','Jason', 'Jake','Jake'],
        'bonus': [10,20, 10, 30, 20],'weight': [1,1,0.5,0.5,1]}
df = pd.DataFrame(raw_data, columns = ['area','first_name','bonus','weight'])
df

Ответы [ 2 ]

2 голосов
/ 15 апреля 2020

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

(df.groupby('first_name')[['bonus', 'weight']].sum()
  #.add_prefix('sum_') # you could also want it
   .assign(result = lambda x: x['bonus'].div(x['weight'])))

или

(df[['first_name', 'bonus', 'weight']].groupby('first_name').sum()
  #.add_prefix('sum_')
   .assign(result = lambda x: x['bonus'].div(x['weight'])))

Выход

            bonus  weight     result
first_name                          
Jake           50     1.5  33.333333
Jason          40     2.5  16.000000
1 голос
/ 15 апреля 2020

Один из способов - использовать groupby().apply и np.average:

df.groupby('first_name').apply(lambda x: np.average(x.bonus, weights=x.weight))

Выход:

first_name
Jake     23.333333
Jason    14.000000
dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...