2014-07-17 11 views
6

मेरे पास एक बहुआयामी डेटाफ्रेम डीएफ 1 है, और लूप के प्रत्येक इंस्टेंस में इस तरह से लूप करना चाहते हैं कि नियमित गैर-पदानुक्रमित इंडेक्स वाला डेटाफ्रेम है जो उप-समूह है बाह्य सूचकांक प्रविष्टियों के अनुरूप डीएफ 1। यानी, अगर मेरे पास है:पांडा में एक मल्टीइंडेक्स पर लूपिंग

FirstTable

मैं

SecondTable

और बाद में C1, C2, आदि मैं भी क्या इन के नाम वास्तव में हो जाएगा पता नहीं है प्राप्त करना चाहते हैं (सी 1, इत्यादि, यहां प्लेसहोल्डर्स हैं), तो बस मेरे पास i मानों की संख्या से अधिक लूप करना पसंद करेंगे।

मैं iterrows और विभिन्न लूप के साथ ठोकर खा रहा हूं और कोई ठोस परिणाम नहीं प्राप्त कर रहा हूं और वास्तव में नहीं जानता कि कैसे आगे बढ़ना है। मुझे लगता है कि एक साधारण समाधान मौजूद होना चाहिए लेकिन दस्तावेज में मददगार कुछ भी नहीं मिला, शायद मेरी समझ की कमी के कारण।

उत्तर

7

एक संशोधित उदाहरण का उपयोग here से

In [30]: def mklbl(prefix,n): 
     return ["%s%s" % (prefix,i) for i in range(n)] 
    ....: 

In [31]: columns = MultiIndex.from_tuples([('a','foo'),('a','bar'), 
            ('b','foo'),('b','bah')], 
            names=['lvl0', 'lvl1']) 

In [33]: index = MultiIndex.from_product([mklbl('A',4),mklbl('B',2)]) 

In [34]: df = DataFrame(np.arange(len(index)*len(columns)).reshape((len(index),len(columns))), 
       index=index, 
       columns=columns).sortlevel().sortlevel(axis=1) 

In [35]: df 
Out[35]: 
lvl0  a   b  
lvl1 bar foo bah foo 
A0 B0 1 0 3 2 
    B1 5 4 7 6 
A1 B0 9 8 11 10 
    B1 13 12 15 14 
A2 B0 17 16 19 18 
    B1 21 20 23 22 
A3 B0 25 24 27 26 
    B1 29 28 31 30 

In [36]: df.loc['A0'] 
Out[36]: 
lvl0 a   b  
lvl1 bar foo bah foo 
B0  1 0 3 2 
B1  5 4 7 6 

In [37]: df.loc['A1'] 
Out[37]: 
lvl0 a   b  
lvl1 bar foo bah foo 
B0  9 8 11 10 
B1  13 12 15 14 

कोई पाशन आवश्यक है।

आप फ्रेम को वापस करने के लिए इन्हें भी चुन सकते हैं (मूल एमआई के साथ) उदा। df.loc[['A1']]

आप सूचकांक में मूल्यों को प्राप्त करना चाहते हैं:

In [38]: df.index.get_level_values(0).unique() 
Out[38]: array(['A0', 'A1', 'A2', 'A3'], dtype=object) 
+0

धन्यवाद करने के लिए सूचकांक, कि काम करता है में परिवर्तित कर देंगे, लेकिन मैं क्या कर अगर मैं नहीं करता? अर्थात। मुझे इंडेक्स के नाम नहीं पता हैं (मेरी समस्या में, वे (आपके उदाहरण में ए) कुछ मिनट हैं जिनमें कम से कम एक घटना हुई है, और उप इंडेक्स (आपके उदाहरण में बी) में वे सेकंड हैं जिनमें विशिष्ट घटनाएं हुईं)। मुझे नहीं पता कि घटनाएं कब हुईं। साथ ही, आपका उदाहरण इंडेक्स के सभी तत्वों के माध्यम से पुन: सक्रिय नहीं होता है और मैं हर मिनट के माध्यम से लूप करना चाहता हूं। –

+0

यह दिखाने के लिए अपडेट किया गया कि स्तर मान कैसे प्राप्त करें। यदि आप वास्तव में लूप करना चाहते हैं तो लूपिंग सीधा है। – Jeff

+0

@jeff क्या आप इस [उपयोग मामले] पर देख सकते हैं (http://stackoverflow.com/questions/38352742/pandas-design-considerations-for-multiindexed-dataframes)? – toasteez

0

आप इस तरह कुछ करने के लिए कोशिश कर रहे हैं?

for i in set(df.index): 
    print df.loc[i].reset_index() 
  1. set(df.index) अपने बहु सूचकांक (श्रेणीबद्ध सूचकांक) की अनूठी tuples का एक सेट देता है।
  2. df.loc[i].reset_index() ... निश्चित रूप से df.loc[i] अपने मूल dataframe के एक सबसेट देता है, और अगर मुझे पता है कि लेबल है .reset_index() हिस्सा कॉलम
संबंधित मुद्दे