2014-09-12 19 views
7

में क्रमबद्ध करने का सबसे तेज़ तरीका मुझे लाखों पंक्तियों और सौ स्तंभों के साथ डेटाफ्रेम में प्रत्येक पंक्ति को क्रमबद्ध करने का सबसे तेज़ तरीका ढूंढना होगा।प्रत्येक पंक्ति को पांडा डेटाफ्रेम

तो कुछ इस तरह: अभी मैं प्रत्येक पंक्ति के प्रकार को लागू करने रहा हूँ और पंक्ति से एक नया dataframe पंक्ति का निर्माण

A B C D 
8 4 3 1 
9 7 2 2 

:

A B C D 
3 4 8 1 
9 2 7 2 

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

+0

इसे स्थानांतरित करें, इसे सॉर्ट करें, इसे वापस स्थानांतरित करें? –

+0

इसे ट्रांसपोज़ करने से सॉर्टिंग तेज हो जाएगी? – Luke

+0

आप बस मैपिंग के "दृश्य" को बदलते हैं ... इसलिए आपको अभी भी ऐसा करने की ज़रूरत है, लेकिन आप एक ही स्थान पर 1xx100 100x1m में बदलते हैं, इसे सॉर्ट करें, फिर इसे उलट दें, आपके पास बस अलग दृश्य है डेटा वापस –

उत्तर

10

मुझे लगता है मैं numpy में यह करना होगा:

In [11]: a = df.values 

In [12]: a.sort(axis=1) # no ascending argument 

In [13]: a = a[:, ::-1] # so reverse 

In [14]: a 
Out[14]: 
array([[8, 4, 3, 1], 
     [9, 7, 2, 2]]) 

In [15]: pd.DataFrame(a, df.index, df.columns) 
Out[15]: 
    A B C D 
0 8 4 3 1 
1 9 7 2 2 

मैं इस काम हो सकता है सोचा था, लेकिन यह कॉलम सॉर्ट करता:

In [21]: df.sort(axis=1, ascending=False) 
Out[21]: 
    D C B A 
0 1 8 4 3 
1 2 7 2 9 

आह, पांडा को जन्म देती है:

In [22]: df.sort(df.columns, axis=1, ascending=False) 
ValueError: When sorting by column, axis must be 0 (rows) 
4

@A द्वारा दिए गए उत्तर में जोड़ें एनडी-हेडन, इस जगह को पूरे फ्रेम में करने के लिए ... वास्तव में यह सुनिश्चित नहीं है कि यह क्यों काम करता है, लेकिन यह करता है। आदेश पर कोई नियंत्रण नहीं लगता है।

In [97]: A = pd.DataFrame(np.random.randint(0,100,(4,5)), columns=['one','two','three','four','five']) 

    In [98]: A 
    Out[98]: 
    one two three four five 
    0 22 63  72 46 49 
    1 43 30  69 33 25 
    2 93 24  21 56 39 
    3 3 57  52 11 74 

    In [99]: A.values.sort 
    Out[99]: <function ndarray.sort> 

    In [100]: A 
    Out[100]: 
    one two three four five 
    0 22 63  72 46 49 
    1 43 30  69 33 25 
    2 93 24  21 56 39 
    3 3 57  52 11 74 

    In [101]: A.values.sort() 

    In [102]: A 
    Out[102]: 
    one two three four five 
    0 22 46  49 63 72 
    1 25 30  33 43 69 
    2 21 24  39 56 93 
    3 3 11  52 57 74 
    In [103]: A = A.iloc[:,::-1] 

    In [104]: A 
    Out[104]: 
    five four three two one 
    0 72 63  49 46 22 
    1 69 43  33 30 25 
    2 93 56  39 24 21 
    3 74 57  52 11 3 

मुझे आशा है कि किसी को, बस खुश है कि यह 8 काम करता है) यह क्यों की व्याख्या कर सकते हैं

+0

'एवल्यूज '' ए' के numpy प्रतिनिधित्व देता है, तो यह' sort' बस एक numpy तरह है, जगह में किया जाता है। – ptrj

1

आप pd.apply इस्तेमाल कर सकते हैं।

Eg: 

A = pd.DataFrame(np.random.randint(0,100,(4,5)), columns=['one','two','three','four','five']) 
print (A) 

    one two three four five 
0 2 75  44 53 46 
1 18 51  73 80 66 
2 35 91  86 44 25 
3 60 97  57 33 79 

A = A.apply(np.sort, axis = 1) 
print(A) 

    one two three four five 
0 2 44  46 53 75 
1 18 51  66 73 80 
2 25 35  44 86 91 
3 33 57  60 79 97 

चूंकि आप इसे अवरोही क्रम में चाहते हैं, तो आप बस डेटा फ्रेम को -1 से गुणा कर सकते हैं और इसे सॉर्ट कर सकते हैं।

A = pd.DataFrame(np.random.randint(0,100,(4,5)), columns=['one','two','three','four','five']) 
A = A * -1 
A = A.apply(np.sort, axis = 1) 
A = A * -1 
संबंधित मुद्दे