2014-10-21 23 views
9

में विकर्ण नीचे तत्व (अनुक्रमणिका, रंग) प्राप्त करें मेरे पास एक पांडा डेटाफ्रेम, डीएफ है।पांडा: डेटाफ्रेम

मैं डीएफ में सभी (कॉल, इंडेक्स) की एक सूची निकालना चाहता हूं जिसके लिए मूल्य (कॉल, इंडेक्स)> .95।

इसके अतिरिक्त, मैं इस तथ्य पर शर्त रखना चाहता हूं कि वे डीएफ के निचले विकर्ण में हैं, जिसमें विकर्ण भी शामिल नहीं है। (यदि यह मदद करता है, तो यह एक सहसंबंध डीएफ है, इसलिए विकर्ण 1 है जो मुझे रूचि नहीं है।)

मैं यह कैसे कर सकता हूं?

+1

यह दिलचस्प है चाहते हैं है। मुझे numpy.diagonal() के बारे में पता है, लेकिन ऐसा लगता है कि इसके नीचे के तत्वों की बजाय केवल विकर्ण पर मान वापस आते हैं .... – svenkatesh

उत्तर

7
In [71]: df = DataFrame(np.arange(25).reshape(5,5)) 

In [72]: df 
Out[72]: 
    0 1 2 3 4 
0 0 1 2 3 4 
1 5 6 7 8 9 
2 10 11 12 13 14 
3 15 16 17 18 19 
4 20 21 22 23 24 

यह मास्क ऊपरी त्रिकोण (विकर्ण शामिल हैं)

In [73]: mask = np.ones(df.shape,dtype='bool') 

In [74]: mask[np.triu_indices(len(df))] = False 

In [75]: mask 
Out[75]: 
array([[False, False, False, False, False], 
     [ True, False, False, False, False], 
     [ True, True, False, False, False], 
     [ True, True, True, False, False], 
     [ True, True, True, True, False]], dtype=bool) 

अपनी हालत को अनुकरण (> 0.95)

मैं इस सवाल का जवाब भी पता करने के लिए उत्सुक हूँ -

यह फ़ॉर्म आपको परिणाम चाहते

In [77]: df[(df>16)&mask] 
Out[77]: 
    0 1 2 3 4 
0 NaN NaN NaN NaN NaN 
1 NaN NaN NaN NaN NaN 
2 NaN NaN NaN NaN NaN 
3 NaN NaN 17 NaN NaN 
4 20 21 22 23 NaN 

समस्या क्या तुम सच में स्थितीय मूल्यों

In [78]: x = ((df>16)&mask).values.nonzero() 

In [79]: zip(x[0],x[1]) 
Out[79]: [(3, 2), (4, 0), (4, 1), (4, 2), (4, 3)] 
6

df.mask का उपयोग कर ऊपरी विकर्ण में मानों को मुखौटा कर सकते हैं।

एक तरीका np.triu का उपयोग करना होगा। यह मानों को शून्य के निचले-दाएं में शून्य पर सेट करता है। यहाँ एक उदाहरण है:

>>> df = pd.DataFrame({'a': [3]*5, 'b': [2]*5, 'c': [1]*5, 'd': [0]*5, 'e': [6]*5}) 
>>> df 
    a b c d e 
0 3 2 1 0 6 
1 3 2 1 0 6 
2 3 2 1 0 6 
3 3 2 1 0 6 
4 3 2 1 0 6 

>>> df.mask(np.triu(np.ones(df.shape, dtype=np.bool_))) 
    a b c d e 
0 NaN NaN NaN NaN NaN 
1 3 NaN NaN NaN NaN 
2 3 2 NaN NaN NaN 
3 3 2 1 NaN NaN 
4 3 2 1 0 NaN 

निम्नलिखित अभिव्यक्ति भी एक ही DataFrame पैदा करता है:

df.mask(np.arange(df.shape[0]) >= np.arange(df.shape[1])[:, np.newaxis]) 

फिर आप हमेशा की तरह इस नए DataFrame क्वेरी कर सकते हैं। उदाहरण के लिए:

>>> dfm = df.mask(np.triu(np.ones(df.shape, dtype=np.bool_))) 
>>> dfm[dfm > 1] 
    a b c d e 
0 NaN NaN NaN NaN NaN 
1 3 NaN NaN NaN NaN 
2 3 2 NaN NaN NaN 
3 3 2 NaN NaN NaN 
4 3 2 NaN NaN NaN 

अपने वांछित मूल्यों का सूचकांक की एक सूची प्राप्त करने के लिए, यहाँ एक ही विकल्प है:

>>> a = dfm[dfm > 1] 
>>> np.stack(a.notnull().values.nonzero()).T.tolist() 
[[1, 0], [2, 0], [2, 1], [3, 0], [3, 1], [4, 0], [4, 1]] 
संबंधित मुद्दे