Вычислить средневзвешенное значение в пандах с уникальным условием

Я пытаюсь вычислить средневзвешенное значение столбца «цены» в следующем фрейме данных для каждой зоны, независимо от часа. Я хочу по существу суммировать количества, соответствующие A, разделить каждую отдельную строку количества на это количество (чтобы получить веса), а затем умножить его на цену.

Есть около 200 зон, мне трудно написать что-то, что в общем определит, что зоны совпадают, и не нужно писать df['ZONE'] = 'A' и т. Д. Пожалуйста, помогите моему потерянному я =)

HOUR:   1,2,3,1,2,3,1,2,3

ZONE:   A,A,A,B,B,B,C,C,C

PRICE:  12,15,16,17,12,11,12,13,15

QUANTITY: 5,6,1 5,7,9 6,3,2

Я не уверен, что вы можете написать что-нибудь в общих чертах, но я подумал, что, если бы я написал функцию, где x - моя «зона», создам список с возможными зонами, а затем создам цикл for. Вот функция, которую я написал, на самом деле не работает - пытаюсь понять, как еще я могу заставить ее работать

def wavgp(x):
    df.loc[df['ZONE'].isin([str(x)])] = x

person pgottmann    schedule 23.01.2019    source источник


Ответы (1)


Вот возможное решение с использованием операции groupby :

weighted_price = df.groupby('ZONE').apply(lambda x: (x['PRICE'] * x['QUANTITY']).sum()/x['QUANTITY'].sum())

Объяснение

Сначала мы группируем по зонам, для каждого из этих блоков (одной и той же зоны) мы собираемся умножить цену на количество и просуммировать эти значения. Мы делим этот результат на сумму количества, чтобы получить желаемый результат.

ZONE
A    13.833333
B    12.761905
C    12.818182
dtype: float64

person abcdaire    schedule 23.01.2019