2014-09-19 10 views
24

का उपयोग कर पांडा मल्टीइंडेक्स डेटाफ्रेम पर पुनरावृत्ति कैसे करें मेरे पास एक डेटा फ्रेम डीएफ है जो इस तरह दिखता है। दिनांक और समय 2 मल्टीलेवल इंडेक्सइंडेक्स

      observation1 observation2 
date   Time        
2012-11-02 9:15:00  79.373668  224 
       9:16:00  130.841316  477 
2012-11-03 9:15:00  45.312814  835 
       9:16:00  123.776946  623 
       9:17:00  153.76646  624 
       9:18:00  463.276946  626 
       9:19:00  663.176934  622 
       9:20:00  763.77333  621 
2012-11-04 9:15:00  115.449437  122 
       9:16:00  123.776946  555 
       9:17:00  153.76646  344 
       9:18:00  463.276946  212 

मैं दैनिक डेटा ब्लॉक पर कुछ जटिल प्रक्रिया करना चाहता हूं।

छद्म कोड की तरह

for count in df(level 0 index) : 
    new_df = get only chunk for count 
    complex_process(new_df) 

तो लगेगा, सब से पहले, मैं

2012-11-03 9:15:00  45.312814  835 
       9:16:00  123.776946  623 
       9:17:00  153.76646  624 
       9:18:00  463.276946  626 
       9:19:00  663.176934  622 
       9:20:00  763.77333  621 

एक तिथि के लिए केवल ब्लॉक का उपयोग और उसके बाद के प्रसंस्करण के लिए इसे भेजने के लिए एक तरह से नहीं मिल सका। मैं इसे लूप के लिए कर रहा हूं क्योंकि मुझे यकीन नहीं है कि स्तर 0 कॉलम के सटीक मूल्य का उल्लेख किए बिना ऐसा करने का कोई तरीका है या नहीं। मैंने कुछ बुनियादी खोज की और df.index.get_level_values ​​(0) प्राप्त करने में सक्षम किया, लेकिन यह मुझे सभी मान देता है और जो लूप को दिन के लिए कई बार चलाने का कारण बनता है। मैं प्रति दिन डेटाफ्रेम बनाना चाहता हूं और इसे प्रसंस्करण के लिए भेजना चाहता हूं।

उत्तर

37

इंडेक्स के पहले स्तर को समूहबद्ध करने का एक आसान तरीका होगा - ग्रुपबी ऑब्जेक्ट पर पुनरावृत्ति समूह कुंजी और प्रत्येक समूह वाले सबफ्रेम को वापस कर देगा।

In [136]: for date, new_df in df.groupby(level=0): 
    ...:  print(new_df) 
    ...:  
        observation1 observation2 
date  Time        
2012-11-02 9:15:00  79.373668   224 
      9:16:00 130.841316   477 

        observation1 observation2 
date  Time        
2012-11-03 9:15:00  45.312814   835 
      9:16:00 123.776946   623 
      9:17:00 153.766460   624 
      9:18:00 463.276946   626 
      9:19:00 663.176934   622 
      9:20:00 763.773330   621 

        observation1 observation2 
date  Time        
2012-11-04 9:15:00 115.449437   122 
      9:16:00 123.776946   555 
      9:17:00 153.766460   344 
      9:18:00 463.276946   212 
+0

में मदद करता है कि !. मैं बल्कि चौराहे के रास्ते का पालन कर रहा था - पहली बार सूचकांक को खोजने योग्य और फिर इलोक का उपयोग करके इसे टुकड़ा कर रहा था। – Yantraguru

4

इसके बारे में क्या?

for idate in df.index.get_level_values('date'): 
    complex_process(df.ix[idate], idate) 
+1

इस समाधान के साथ सावधान रहें, ध्यान दें कि मूर्ति के प्रत्येक मूल्य को कई बार मारा जा सकता है। आपको np.unique (df.index.get_level_values ​​('date') में idate के लिए करना चाहिए): नोट था अतिरिक्त np.unique। –

+0

मुझे लगता है कि 'df.index.get_level_values ​​(' date ')। अद्वितीय()' @melbay के रूप में बेहतर हो सकता है। –

0

@psorenson जवाब के बंद टैगिंग, हम अद्वितीय स्तर सूचकांक और numpy बिना इससे जुड़े डेटा फ्रेम स्लाइस इस प्रकार प्राप्त कर सकते हैं:

for date in df.index.get_level_values('date').unique(): 
    print(df.loc[date])