У меня есть набор данных с весами для каждого наблюдения, и я хочу подготовить взвешенные резюме, используя groupby
, но я ржавый относительно того, как лучше всего это сделать. Я думаю, что это подразумевает пользовательскую функцию агрегации. Моя проблема заключается в том, как правильно обрабатывать не элементарные данные, а групповые данные. Возможно, это означает, что лучше всего делать это шаг за шагом, а не за один раз.pandas: groupby и переменные веса
В псевдокоде Ищу
#first, calculate weighted value
for each row:
weighted jobs = weight * jobs
#then, for each city, sum these weights and divide by the count (sum of weights)
for each city:
sum(weighted jobs)/sum(weight)
Я не знаю, как работать «для каждого города» -часть в пользовательские функции совокупного и получить доступ к резюме на уровне группы.
Ложные данные:
import pandas as pd
import numpy as np
np.random.seed(43)
## prep mock data
N = 100
industry = ['utilities','sales','real estate','finance']
city = ['sf','san mateo','oakland']
weight = np.random.randint(low=5,high=40,size=N)
jobs = np.random.randint(low=1,high=20,size=N)
ind = np.random.choice(industry, N)
cty = np.random.choice(city, N)
df_city =pd.DataFrame({'industry':ind,'city':cty,'weight':weight,'jobs':jobs})
определенно работоспособный - отлично! Я буду делать взвешивание для многих переменных и хотел бы включить в группу функцию, которую я мог бы назвать на лету; изменять уровни группировки и т. д. Любой способ это можно сделать за один шаг (т. е. в групповом вызове, передавая пользовательскую функцию с уровнем группировки, переменную для взвешивания как аргументы?) – ako
. вы можете использовать groupby apply с помощью 'def f (x): return (1. * x ['weight'] * x ['jobs']). sum()/x ['jobs']. sum()', но это вероятно, будет менее эффективным, чем выше. –