2015-11-11 183 views
5

我也忒以下大熊貓據幀:計算加權平均大熊貓據幀

data_df = pd.DataFrame({'ind':['la','p','la','la','p','g','g','la'], 
         'dist':[10.,5.,7.,8.,7.,2.,5.,3.], 
         'diff':[0.54,3.2,8.6,7.2,2.1,1.,3.5,4.5], 
         'cas':[1.,2.,3.,4.,5.,6.,7.,8.]}) 

cas diff dist ind 
0 1 0.54 10 la 
1 2 3.20  5 p 
2 3 8.60  7 la 
3 4 7.20  8 la 
4 5 2.10  7 p 
5 6 1.00  2 g 
6 7 3.50  5 g 
7 8 4.50  3 la 

我需要計算所有列的加權平均值,其中權重是在' dist'列並將這些值按'ind'分組。

例如關於「IND」 =「LA」和「差異」柱:

((10*0.54)+(8.60*7)+(7.20*8)+(4.50*3))/(10+7+8+3) = 4.882143 

欲獲得的結果爲下列

 cas  diff 
ind      
g 6.714286 2.785714 
la 3.107143 4.882143 
p 3.750000 2.558333 

其通過乘以每個獲得的每個柱子的值由'dist'列中的相應值相加,將結果與相同的'ind'相加,然後將結果除以所有與相同ind相對應的'dist'值的總和。

我認爲這將是一個簡單的任務,由數據框'groupby'方法完成,但實際上它有點棘手。

有人可以幫我嗎?

回答

6

您可以通過使用transform組內獲得規格化權

>>> df['weight'] = df['dist']/df.groupby('ind')['dist'].transform('sum') 
>>> df['weight'] 
0 0.357143 
1 0.416667 
2 0.250000 
3 0.285714 
4 0.583333 
5 0.285714 
6 0.714286 
7 0.107143 
Name: weight, dtype: float64 

然後,你只需要在值乘這些重量,並採取總和:

>>> df['wcas'], df['wdiff'] = (df[n] * df['weight'] for n in ('cas', 'diff')) 
>>> df.groupby('ind')[['wcas', 'wdiff']].sum() 
     wcas  wdiff 
ind      
g 6.714286 2.785714 
la 3.107143 4.882143 
p 3.750000 2.558333 

編輯:帶原位突變:

>>> backup = df.copy()  # make a backup copy to mutate in place 
>>> cols = df.columns[:2] # cas, diff 
>>> df[cols] = df['weight'].values[:, None] * df[cols] 
>>> df.groupby('ind')[cols].sum() 
      cas  diff 
ind      
g 6.714286 2.785714 
la 3.107143 4.882143 
p 3.750000 2.558333 
+0

這實際上是工作!謝謝。唯一的問題是我寫的數據框只是一個例子,我正在處理大數據和數千列,所以我一直在尋找一個解決方案,我不必寫下列名... – Cecilia

+0

@塞西莉亞,你可以通過使用'df.columns'獲得列的列表,並使用編輯 –

+0

謝謝!這是我正在尋找的解決方案:) – Cecilia