2012-08-30 47 views
8

我有一個數據幀「RPT」由(STK_ID,RPT_Date)索引,包含每個qurter累計銷售庫存:如何做一個由多級索引「GROUPBY」在熊貓

     sales 
STK_ID RPT_Date 
000876 20060331  798627000 
     20060630  1656110000 
     20060930  2719700000 
     20061231  3573660000 
     20070331  878415000 
     20070630  2024660000 
     20070930  3352630000 
     20071231  4791770000 
600141 20060331  270912000 
     20060630  658981000 
     20060930  1010270000 
     20061231  1591500000 
     20070331  319602000 
     20070630  790670000 
     20070930  1250530000 
     20071231  1711240000 

我想用STK_ID & RPT_Yr計算單個querterly銷售使用'groupby',如:RPT.groupby('STK_ID','RPT_Yr')['sales'].transform(lambda x: x-x.shift(1)),該怎麼做?

想我可以通過lambda x : datetime.strptime(x, '%Y%m%d').year

回答

8

這裏假設RPT_Data是一個字符串,有什麼理由不使用日期時間拿到年終?

可以使用函數進行分組,但僅限於非MultiIndex索引。通過重置索引來解決此問題,並將'RPT_Date'設置爲提取年份的索引(注意:pandas在'RPT_Date'中將object和int在dtype之間切換)。

In [135]: year = lambda x : datetime.strptime(str(x), '%Y%m%d').year 

In [136]: grouped = RPT.reset_index().set_index('RPT_Date').groupby(['STK_ID', year]) 

In [137]: for key, df in grouped: 
    .....:  print key 
    .....:  print df 
    .....: 
(876, 2006) 
      STK_ID  sales 
RPT_Date 
20060331  876 798627000 
20060630  876 1656110000 
20060930  876 2719700000 
20061231  876 3573660000 
(876, 2007) 
      STK_ID  sales 
RPT_Date 
20070331  876 878415000 
20070630  876 2024660000 
20070930  876 3352630000 
20071231  876 4791770000 
(600141, 2006) 
      STK_ID  sales 
RPT_Date 
20060331 600141 270912000 
20060630 600141 658981000 
20060930 600141 1010270000 
20061231 600141 1591500000 
(600141, 2007) 
      STK_ID  sales 
RPT_Date 
20070331 600141 319602000 
20070630 600141 790670000 
20070930 600141 1250530000 
20071231 600141 1711240000 

另一種選擇是使用TMP列

In [153]: RPT_tmp = RPT.reset_index() 

In [154]: RPT_tmp['year'] = RPT_tmp['RPT_Date'].apply(year) 

In [155]: grouped = RPT_tmp.groupby(['STK_ID', 'year']) 

編輯 重新整理架使它更容易。

In [48]: RPT 
Out[48]: 
            sales 
STK_ID RPT_Year RPT_Quarter    
876 2006  0    798627000 
       1   1656110000 
       2   2719700000 
       3   3573660000 
     2007  0    878415000 
       1   2024660000 
       2   3352630000 
       3   4791770000 
600141 2006  0    270912000 
       1    658981000 
       2   1010270000 
       3   1591500000 
     2007  0    319602000 
       1    790670000 
       2   1250530000 
       3   1711240000 

In [49]: RPT.groupby(level=['STK_ID', 'RPT_Year'])['sales'].apply(sale_per_q) 
Out[49]: 
STK_ID RPT_Year RPT_Quarter 
876  2006  0    798627000 
        1    857483000 
        2    1063590000 
        3    853960000 
     2007  0    878415000 
        1    1146245000 
        2    1327970000 
        3    1439140000 
600141 2006  0    270912000 
        1    388069000 
        2    351289000 
        3    581230000 
     2007  0    319602000 
        1    471068000 
        2    459860000 
        3    460710000 
+2

這是相當棘手的代碼是醜陋的。有沒有pythonic或pandasnic的方式來做到這一點? – bigbug

+0

'sale_per_q'的代碼是什麼? – bigbug

+0

def sale_per_q(s): sq = s.diff() sq [s.index [0]] = s.iget(0) return sq –

0

嘗試

RPT['sales'].groupby([RPT['STK_ID'],RPT['RPT_Yr']]).sum() 

^^你需要一個列表中引用的索引。這對我工作