2012-08-30 23 views
8

मैं एक dataframe '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 द्वारा 'groupby' का उपयोग करके एकल qurterly बिक्री की गणना करें, जैसे: 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 एक स्ट्रिंग, किसी भी कारण से क्यों नहीं Datetime उपयोग करने के लिए है वर्ष प्राप्त कर सकते हैं लगता है?

फ़ंक्शंस का उपयोग करके समूह बनाना संभव है, लेकिन केवल गैर मल्टी इंडेक्स-इंडेक्स पर। इंडेक्स को रीसेट करके इस पर काम करना, और वर्ष को निकालने के लिए 'RPT_Date' को इंडेक्स के रूप में सेट करें (नोट: पांडस 'RPT_Date' के लिए टाइप के रूप में ऑब्जेक्ट और int के बीच टॉगल करता है)।

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

यह काफी मुश्किल है और कोड बदसूरत है। क्या ऐसा करने के लिए कोई पाइथोनिक या पांडासिक तरीका है? – bigbug

+0

'sale_per_q' का कोड क्या है? – bigbug

+0

def sale_per_q (ओं): वर्ग = s.diff() वर्ग [s.index [0]] = s.iget (0) वापसी वर्ग –

0

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

की कोशिश करो। यह मेरे लिए काम किया

संबंधित मुद्दे