Рассчитать средневзвешенное значение в пандах с уникальным условием - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь рассчитать средневзвешенное значение столбца «цены» в следующем кадре данных для каждой зоны независимо от часа. Я хочу по существу суммировать количества, которые соответствуют 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

1 Ответ

0 голосов
/ 23 января 2019

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

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

Explaination

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

ZONE
A    13.833333
B    12.761905
C    12.818182
dtype: float64

...