2015-07-22 127 views
1

我正在努力獲得每天每隻股票的平均值和總額值。熊貓:計算每天每隻股票的平均值和總值

我的數據是一樣

ric date volume 
vod 7-17  43 
vod 7-17  4444 
vod 7-17  53 
vod 7-18  66 
vod 7-19  77 
vod 7-19  29 
...  ...  ... 
bat 7-17  87 
bat 7-18  99 
...  ...  ... 

,我想將其轉換爲

ric date volume day_v_vol day_sum_vol 
vod 7-17  43  1513   4541 
vod 7-17  4444 1513   4541 
vod 7-17  53  1513   4541 
vod 7-18  66  66   66 
vod 7-19  77  53   106 
vod 7-19  29  53   106 
...  ...  ...  ...   ... 
bat 7-17  87  87   87 
bat 7-18  99  99   99 
...  ...  ...  ...   ... 

我用 'GROUPBY' 的方法,

grouped=data.groupby(['ric','date']) 
data['sumbas']=grouped.sum() 
data['avbas']=grouped.mean() 

,但它不是很方便。 'groupby'之後,我需要將新數據集與舊數據集合並。

任何人都可以給我一些快速的方法,可以直接生成我想要的?提前致謝 !

回答

1

您可以使用agg傳遞要在groupby對象上執行的函數列表。

import numpy as np 

grouped = df.groupby(['date', 'ric']).volume.agg([sum, np.mean]) 
grouped.columns = ['sumbas', 'avbas'] 

>>> grouped 

      sumbas avbas 
date ric    
7-17 bat  87  87 
    vod 4530 1510 
7-18 bat  99  99 
    vod  66  66 
7-19 vod  106  53 

您仍然需要加入回你原來的數據幀:

>>>df.set_index(['date', 'ric']).join(grouped) 

      volume sumbas avbas 
date ric      
7-17 bat  87  87  87 
    vod  43 4530 1510 
    vod 4444 4530 1510 
    vod  43 4530 1510 
7-18 bat  99  99  99 
    vod  66  66  66 
7-19 vod  77  106  53 
    vod  29  106  53 

的另一種方法是創建一個groupby對象,然後反覆調用transform

gb_vol = df.groupby(['date', 'ric'])['volume'] 
for f_name, func in zip(['daily_vol', 'davg_vol'], 
         [np.sum, np.mean]): 
    df[f_name] = gb_vol.transform(func) 

>>> df 
    ric date volume daily_vol davg_vol 
6 bat 7-17  87   87  87 
0 vod 7-17  43  4530  1510 
1 vod 7-17 4444  4530  1510 
2 vod 7-17  43  4530  1510 
7 bat 7-18  99   99  99 
3 vod 7-18  66   66  66 
4 vod 7-19  77  106  53 
5 vod 7-19  29  106  53 
+0

喜亞歷克斯感謝爲你的代碼。我導入了熊貓和numpy並應用您的代碼。但系統給了我:NameError:名稱'df'未定義 –

+0

'df'只是您使用的任何數據幀的變量名稱。 – Alexander

+0

再次感謝。我改變了變量名稱。但是這次它顯示:ValueError:列重疊,但沒有指定後綴:Index([u'avbas'],dtype ='object') –