दो या अधिक स्तंभों द्वारा अजगर पंडों में डेटाफ़्रेम कैसे सॉर्ट करें?


255

मान लीजिए कि मेरे पास कॉलम के साथ एक डेटाफ्रेम है a, bऔर c, मैं bआरोही क्रम में कॉलम द्वारा डेटाफ्रेम को सॉर्ट करना चाहता हूं , और cअवरोही क्रम में कॉलम द्वारा , मैं यह कैसे करूं?


इस जवाब की जांच stackoverflow.com/a/14946246/1948860
रिची

जवाबों:


454

0.17.0 रिलीज के अनुसार, sortविधि के पक्ष में पदावनत किया गया था sort_valuessort0.20.0 रिलीज में पूरी तरह से हटा दिया गया था। तर्क (और परिणाम) समान रहते हैं:

df.sort_values(['a', 'b'], ascending=[True, False])

आप के बढ़ते तर्क का उपयोग कर सकते हैं sort:

df.sort(['a', 'b'], ascending=[True, False])

उदाहरण के लिए:

In [11]: df1 = pd.DataFrame(np.random.randint(1, 5, (10,2)), columns=['a','b'])

In [12]: df1.sort(['a', 'b'], ascending=[True, False])
Out[12]:
   a  b
2  1  4
7  1  3
1  1  2
3  1  2
4  3  2
6  4  4
0  4  3
9  4  3
5  4  1
8  4  1

जैसा कि @renadeen ने टिप्पणी की है

सॉर्ट डिफ़ॉल्ट रूप से जगह में नहीं है! तो आपको एक चर के लिए सॉर्ट विधि का परिणाम असाइन करना चाहिए या inplace = true to मेथड कॉल को जोड़ना चाहिए।

यदि आप df1 को एक सॉर्ट किए गए DataFrame के रूप में पुन: उपयोग करना चाहते हैं:

df1 = df1.sort(['a', 'b'], ascending=[True, False])

या

df1.sort(['a', 'b'], ascending=[True, False], inplace=True)

6
सॉर्ट डिफ़ॉल्ट रूप से जगह में नहीं है! तो आपको sortएक चर के लिए विधि का परिणाम निर्दिष्ट करना चाहिए या inplace=Trueविधि कॉल में जोड़ना चाहिए।
16

2
@renadeen बहुत अच्छी बात है, मैं उस टिप्पणी के साथ जवाब द्वारा अद्यतन किया गया है।
एंडी हेडन

1
मुझे आज यह जानकर आश्चर्य हुआ कि उस प्रकार को हटा दिया गया है! इस मेटा पोस्ट के कुछ मतों के आधार पर: meta.stackoverflow.com/questions/297404/… मैंने आपको संपादित करने के प्रयास के बजाय एक नया उत्तर जोड़ने का निर्णय लिया है
काइल ह्युटन

2
@Snoozer हाँ, मुझे नहीं लगता कि सॉर्ट कभी दूर जा रहा है (मुख्यतः जैसा कि यह वेस बुक में बड़े पैमाने पर इस्तेमाल किया गया है), लेकिन कॉलिंग सॉर्ट में कुछ बड़े बदलाव हुए हैं । धन्यवाद! .. मुझे वास्तव में सभी अवधियों के लिए विभिन्न प्रकार के पंडों के उत्तर से गुजरने की आवश्यकता नहीं है!
एंडी हेडन

40

पांडा 0.17.0 के रूप में, DataFrame.sort()पदावनत किया जाता है, और पांडा के भविष्य के संस्करण में हटा दिया जाता है। अपने मानों द्वारा डेटाफ़्रेम छाँटने का तरीका अब हैDataFrame.sort_values

जैसे, अब आपके प्रश्न का उत्तर होगा

df.sort_values(['b', 'c'], ascending=[True, False], inplace=True)

4

संख्यात्मक डेटा की बड़ी डेटाफ़ॉर्म के लिए, आप एक महत्वपूर्ण प्रदर्शन सुधार देख सकते हैं numpy.lexsort, जो कि कुंजियों के अनुक्रम का उपयोग करके एक अप्रत्यक्ष प्रकार करता है:

import pandas as pd
import numpy as np

np.random.seed(0)

df1 = pd.DataFrame(np.random.randint(1, 5, (10,2)), columns=['a','b'])
df1 = pd.concat([df1]*100000)

def pdsort(df1):
    return df1.sort_values(['a', 'b'], ascending=[True, False])

def lex(df1):
    arr = df1.values
    return pd.DataFrame(arr[np.lexsort((-arr[:, 1], arr[:, 0]))])

assert (pdsort(df1).values == lex(df1).values).all()

%timeit pdsort(df1)  # 193 ms per loop
%timeit lex(df1)     # 143 ms per loop

एक ख़ासियत यह है कि इसके साथ परिभाषित छँटाई क्रम numpy.lexsortउलट है: पहले (-'b', 'a')श्रृंखला के अनुसार a। हम bयह दर्शाने के लिए श्रृंखला को नकारते हैं कि हम इस श्रृंखला को अवरोही क्रम में चाहते हैं।

इस बात से अवगत रहें कि np.lexsortकेवल संख्यात्मक मानों के साथ क्रमबद्ध करें, जबकि pd.DataFrame.sort_valuesस्ट्रिंग या संख्यात्मक मानों के साथ काम करते हैं। np.lexsortतार के साथ का उपयोग कर देगा TypeError: bad operand type for unary -: 'str':।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.