দুটি বা ততোধিক কলাম দ্বারা পাইথন পান্ডায় ডেটা ফ্রেম কীভাবে সাজানো যায়?


254

ধরুন আমি কলাম সহ একটি dataframe আছে a, bএবং cআমি কলাম দ্বারা dataframe সাজাতে চান bঅর্ডার আরোহী, এবং কলাম দ্বারা cঅবরোহী, আমি এই কিভাবে করব?


এই উত্তরটি দেখুন stackoverflow.com/a/14946246/1948860
সমৃদ্ধ

উত্তর:


452

০.০7.০ মুক্তির হিসাবে, 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

ডিফল্ট অনুসারে বাছাই করা যায় না! সুতরাং আপনার বাছাইয়ের জন্য বাছাই পদ্ধতিটির ফলাফল নির্ধারণ করা উচিত বা insert = true to পদ্ধতি কল করতে হবে।

এটি হ'ল যদি আপনি df1 কে একটি সাজানো ডেটা ফ্রেম হিসাবে পুনরায় ব্যবহার করতে চান:

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

অথবা

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

6
ডিফল্ট অনুসারে বাছাই করা যায় না! সুতরাং আপনার sortপদ্ধতির ফলাফলটি একটি পরিবর্তনশীলকে নির্ধারণ করা উচিত বা inplace=Trueপদ্ধতি কলটিতে যুক্ত করা উচিত।
পুনর্নির্মাণ

2
@ রেনাদীন খুব ভালো কথা, আমি সেই মন্তব্যে উত্তর দিয়ে আপডেট করেছি।
অ্যান্ডি হেডেন

1
আমি আজ শিখতে অবাক হয়েছি যে এই ধরণের সাজানো অবনতি হয়েছে! এই মেটা পোস্টে কিছু মতামতের ভিত্তিতে: meta.stackoverflow.com/questions/297404/… আমি নিজের কাছে সম্পাদনা করার চেষ্টা না করে একটি নতুন উত্তর যুক্ত করার সিদ্ধান্ত নিয়েছি
কাইল হিউটন

2
@ স্নুজার হ্যাঁ, আমি মনে করি না যে সাজ্ট কখনও চলে যাবে (মূলত ওয়েস-এর বইয়ে এটি ব্যাপকভাবে ব্যবহৃত হয়েছে) তবে কল করার ক্ষেত্রে কিছু বড় পরিবর্তন হয়েছে । ধন্যবাদ! .. আমাকে অবহেলা করার জন্য আমার সমস্ত পান্ডার উত্তর দিয়ে যাওয়ার জন্য স্বয়ংক্রিয়ভাবে প্রয়োজন!
অ্যান্ডি হেডেন

40

পান্ডাস ০.০7.০.০ হিসাবে, অবহিত 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প্রতিফলিত করতে প্রত্যাখ্যান করি আমরা এই সিরিজটিকে অবতরণ ক্রমে চাই want

সচেতন থাকুন যে np.lexsortকেবল সংখ্যাসূচক মানগুলির সাথে বাছাই করুন, তবে pd.DataFrame.sort_valuesস্ট্রিং বা সংখ্যাসূচক মানগুলির সাথে কাজ করে। ব্যবহার np.lexsortস্ট্রিং সঙ্গে দিতে হবে: TypeError: bad operand type for unary -: 'str'

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.