2017-11-01 28 views
1

私は、2つのカテゴリ変数(私の例では都市と色)、パーセンテージのある列、および1つの重み付きのパンダデータフレームを持っています。 私は都市と色のクロス集計を行い、2つの組み合わせのそれぞれについて、パルクの加重平均を示したいと思います。パンダクロス集計:加重平均を計算する方法は?行と列の合計を追加する方法

私は最初に重みx percを持つ列を作成し、次に(重みx perc)の合計を持つ1つのクロス集計、重みの合計を持つ別のクロス集計、次に最終的に分割するコードでそれを実行しました最初の2番目の。

それは動作しますが、はそれを行うためのより早く/よりエレガントな方法はありますか?ありがとう!

import pandas as pd 
import numpy as np 
np.random.seed(123) 
df=pd.DataFrame() 
myrows=10 
df['weight'] = np.random.rand(myrows)*100 

np.random.seed(321) 
df['perc']=np.random.rand(myrows) 
df['weight x perc']=df['weight']*df['perc'] 
df['colour']=np.where(df['perc']<0.5, 'red','yellow') 

np.random.seed(555) 
df['city']=np.where(np.random.rand(myrows) <0.5,'NY','LA') 


num=pd.crosstab(df['city'], df['colour'], values=df['weight x perc'], aggfunc='sum', margins=True) 
den=pd.crosstab(df['city'], df['colour'], values=df['weight'], aggfunc='sum', margins=True) 

out=num/den 

print(out) 

答えて

3

ここでapply()でgroupbyを使用し、numpy加重平均法を使用します。

colour  red yellow 
city      
LA  0.173870 0.865636 
NY  0.077912 0.687400 

を与える

df.groupby(['colour','city']).apply(lambda x: np.average(x.perc, weights=x.weight)).unstack(level=0) 

でも、私は余裕のすべてを持っていません。

これはまだ単一のフレーム

+0

おかげにパッケージングされない確かに合計

df.groupby(['colour']).apply(lambda x: np.average(x.perc, weights=x.weight)) df.groupby(['city']).apply(lambda x: np.average(x.perc, weights=x.weight)) 

を生成します。私は合計が必要なので、私のアプローチは簡単かもしれません。 –

関連する問題