3

各観測の重みを持つデータセットがあり、使用して重み付けされた要約を準備したいのです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})
4

1 に答える 1

7

単純に 2 つの列を乗算します。

In [11]: df_city['weighted_jobs'] = df_city['weight'] * df_city['jobs']

これで、都市ごとにグループ化できます (そして合計を取ることができます):

In [12]: df_city_sums = df_city.groupby('city').sum()

In [13]: df_city_sums
Out[13]: 
           jobs  weight  weighted_jobs
city                                  
oakland     362     690           7958
san mateo   367    1017           9026
sf          253     638           6209

[3 rows x 3 columns]

これで、2 つの合計を除算して、目的の結果を得ることができます。

In [14]: df_city_sums['weighted_jobs'] / df_city_sums['jobs']
Out[14]: 
city
oakland      21.983425
san mateo    24.594005
sf           24.541502
dtype: float64
于 2014-01-22T22:59:20.923 に答える