मान लीजिए कि मेरे पास कॉलम के साथ एक डेटाफ्रेम है a
, b
और c
, मैं b
आरोही क्रम में कॉलम द्वारा डेटाफ्रेम को सॉर्ट करना चाहता हूं , और c
अवरोही क्रम में कॉलम द्वारा , मैं यह कैसे करूं?
मान लीजिए कि मेरे पास कॉलम के साथ एक डेटाफ्रेम है a
, b
और c
, मैं b
आरोही क्रम में कॉलम द्वारा डेटाफ्रेम को सॉर्ट करना चाहता हूं , और c
अवरोही क्रम में कॉलम द्वारा , मैं यह कैसे करूं?
जवाबों:
0.17.0 रिलीज के अनुसार, sort
विधि के पक्ष में पदावनत किया गया था sort_values
। sort
0.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)
sort
एक चर के लिए विधि का परिणाम निर्दिष्ट करना चाहिए या inplace=True
विधि कॉल में जोड़ना चाहिए।
पांडा 0.17.0 के रूप में, DataFrame.sort()
पदावनत किया जाता है, और पांडा के भविष्य के संस्करण में हटा दिया जाता है। अपने मानों द्वारा डेटाफ़्रेम छाँटने का तरीका अब हैDataFrame.sort_values
जैसे, अब आपके प्रश्न का उत्तर होगा
df.sort_values(['b', 'c'], ascending=[True, False], inplace=True)
संख्यात्मक डेटा की बड़ी डेटाफ़ॉर्म के लिए, आप एक महत्वपूर्ण प्रदर्शन सुधार देख सकते हैं 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'
:।