2015-11-03 16 views
6

मेरे पास 2 इंडेक्स के साथ एक पांडा डेटाफ्रेम है। (मल्टीइंडेक्स) मैं df.as_matrix(...) जैसे कुछ के साथ एक नम्पी मैट्रिक्स प्राप्त करना चाहता हूं लेकिन इस मैट्रिक्स में आकार (n_rows, 1) है। मैं आकार (n_index1_rows, n_index2_rows, 1) आकार का एक मैट्रिक्स चाहता हूँ।मल्टीइंडेक्स के साथ पांडस डेटाफ्रेम नम्पी मैट्रिक्स

वांछित आकार प्राप्त करने के लिए .groupby(...) और .values.tolist() या .as_matrix(...) का उपयोग करने का कोई तरीका है?

संपादित: डेटा

               value 
current_date     temp_date           
1970-01-01 00:00:01.446237485 1970-01-01 00:00:01.446237489 30.497100 
           1970-01-01 00:00:01.446237494 9.584300 
           1970-01-01 00:00:01.446237455 10.134200 
           1970-01-01 00:00:01.446237494 7.803683 
           1970-01-01 00:00:01.446237400 10.678700 
           1970-01-01 00:00:01.446237373 9.700000 
           1970-01-01 00:00:01.446237180 15.000000 
           1970-01-01 00:00:01.446236961 12.928866 
           1970-01-01 00:00:01.446237032 10.458800 

यह विचार की तरह है:

np.array([np.resize(x.as_matrix(["value"]).copy(), (500, 1)) for (i, x) in df.reset_index("current_date").groupby("current_date")]) 
+0

आप एक 3 डी सरणी चाहते हैं? या इंडेक्स के साथ ही कॉलम सहित 2 डी सरणी? –

+0

3 डी सरणी। Np.array में सभी मान कॉलम मान (इंडेक्स नहीं) होना चाहिए –

+0

क्या आप वांछित आउटपुट के साथ कुछ नमूना डेटा प्रदान कर सकते हैं? – Alexander

उत्तर

5

मुझे लगता है कि क्या आप चाहते हैं multiindex unstack लिए, उदाहरण के लिए है

df.unstack().values[:, :, np.newaxis] 

संपादित करें: यदि आप डुप्लिकेट सूचकांक होते हैं, unstacking काम नहीं करेगा, और आप शायद एक pivot_table बजाय हैं:

pivoted = df.reset_index().pivot_table(index='current_date', 
             columns='temp_date', 
             aggfunc='mean') 
arr = pivoted.values[:, :, np.newaxis] 
arr.shape 
# (10, 50, 1) 

यहाँ unstack की एक पूरी उदाहरण है। सबसे पहले हम कुछ डेटा बनाएंगे:

current = pd.date_range('2015', periods=10, freq='D') 
temp = pd.date_range('2015', periods=50, freq='D') 
ind = pd.MultiIndex.from_product([current, temp], 
           names=['current_date', 'temp_date']) 
df = pd.DataFrame({'val':np.random.rand(len(ind))}, 
        index=ind) 
df.head() 
#        val 
# current_date temp_date   
# 2015-01-01 2015-01-01 0.309488 
#    2015-01-02 0.697876 
#    2015-01-03 0.621318 
#    2015-01-04 0.308298 
#    2015-01-05 0.936828 

अब हम multiindex unstack: हम डेटा की पहली 4x4 टुकड़ा दिखाएंगे:

df.unstack().iloc[:4, :4] 
#      val         
# temp_date 2015-01-01 2015-01-02 2015-01-03 2015-01-04 
# current_date            
# 2015-01-01  0.309488 0.697876 0.621318 0.308298 
# 2015-01-02  0.323530 0.751486 0.507087 0.995565 
# 2015-01-03  0.805709 0.101129 0.358664 0.501209 
# 2015-01-04  0.360644 0.941200 0.727570 0.884314 

अब numpy सरणी निकालने, और करने के लिए नयी आकृति प्रदान [ nrows x ncols x 1] जैसा कि आपने प्रश्न में निर्दिष्ट किया है:

vals = df.unstack().values[:, :, np.newaxis] 
print(vals.shape) 
# (10, 50, 1) 
+0

मुझे 'ValueError मिलता है: इंडेक्स में डुप्लिकेट प्रविष्टियां होती हैं, अनस्टैक करने का प्रयास करते समय 'रीशेप नहीं कर सकती हैं। मेरे पास पंक्तियों का एक टन है जिसमें कुछ 'temp_date' (लेकिन अलग-अलग मान) हैं। आईडी को लाखों इंडेक्स को अनस्टैक करना है। इससे बचने का कोई रास्ता है क्या? 'Temp_date' reindex या इस तरह कुछ? –

+0

ओह - नहीं पता था कि आपके पास डुप्लिकेट था। उस स्थिति में, आपको इच्छित परिणाम प्राप्त करने के लिए आपको कुछ प्रकार की एकत्रीकरण करने की आवश्यकता है (और आपको यह तय करना होगा कि आपके डेटा के लिए कौन सा एकत्रीकरण उपयुक्त है) एक पिवोट टेबल एक अच्छा दृष्टिकोण होगा: ऊपर मेरा संपादन देखें। – jakevdp

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