ধরুন আমি কলাম সহ একটি dataframe আছে a
, b
এবং c
আমি কলাম দ্বারা dataframe সাজাতে চান b
অর্ডার আরোহী, এবং কলাম দ্বারা c
অবরোহী, আমি এই কিভাবে করব?
ধরুন আমি কলাম সহ একটি dataframe আছে a
, b
এবং c
আমি কলাম দ্বারা dataframe সাজাতে চান b
অর্ডার আরোহী, এবং কলাম দ্বারা c
অবরোহী, আমি এই কিভাবে করব?
উত্তর:
০.০7.০ মুক্তির হিসাবে, 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
ডিফল্ট অনুসারে বাছাই করা যায় না! সুতরাং আপনার বাছাইয়ের জন্য বাছাই পদ্ধতিটির ফলাফল নির্ধারণ করা উচিত বা insert = true to পদ্ধতি কল করতে হবে।
এটি হ'ল যদি আপনি df1 কে একটি সাজানো ডেটা ফ্রেম হিসাবে পুনরায় ব্যবহার করতে চান:
df1 = df1.sort(['a', 'b'], ascending=[True, False])
অথবা
df1.sort(['a', 'b'], ascending=[True, False], inplace=True)
sort
পদ্ধতির ফলাফলটি একটি পরিবর্তনশীলকে নির্ধারণ করা উচিত বা inplace=True
পদ্ধতি কলটিতে যুক্ত করা উচিত।
পান্ডাস ০.০7.০.০ হিসাবে, অবহিত 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
প্রতিফলিত করতে প্রত্যাখ্যান করি আমরা এই সিরিজটিকে অবতরণ ক্রমে চাই want
সচেতন থাকুন যে np.lexsort
কেবল সংখ্যাসূচক মানগুলির সাথে বাছাই করুন, তবে pd.DataFrame.sort_values
স্ট্রিং বা সংখ্যাসূচক মানগুলির সাথে কাজ করে। ব্যবহার np.lexsort
স্ট্রিং সঙ্গে দিতে হবে: TypeError: bad operand type for unary -: 'str'
।