it-swarm.dev

كيفية فرز إطار بيانات الباندا باستخدام قيم من عدة أعمدة؟

لدي إطار البيانات التالي:

df = pandas.DataFrame([{'c1':3,'c2':10},{'c1':2, 'c2':30},{'c1':1,'c2':20},{'c1':2,'c2':15},{'c1':2,'c2':100}])

أو ، في شكل مقروء الإنسان:

   c1   c2
0   3   10
1   2   30
2   1   20
3   2   15
4   2  100

يعمل الأمر الفرز التالي كما هو متوقع:

df.sort(['c1','c2'], ascending=False)

انتاج:

   c1   c2
0   3   10
4   2  100
1   2   30
3   2   15
2   1   20

لكن الأمر التالي:

df.sort(['c1','c2'], ascending=[False,True])

النتائج في

   c1   c2
2   1   20
3   2   15
1   2   30
4   2  100
0   3   10

وهذا ليس ما أتوقعه. أتوقع الحصول على القيم في العمود الأول مرتبة من الأكبر إلى الأصغر ، وإذا كانت هناك قيم متطابقة في العمود الأول ، فترتب حسب القيم الصعودية من العمود الثاني.

لا أحد يعرف لماذا لا يعمل كما هو متوقع؟

أضاف

هذا هو نسخ لصق:

>>> df.sort(['c1','c2'], ascending=[False,True])
   c1   c2
2   1   20
3   2   15
1   2   30
4   2  100
0   3   10
55
Roman

تم إهمال DataFrame.sort ؛ استخدام DataFrame.sort_values .

>>> df.sort_values(['c1','c2'], ascending=[False,True])
   c1   c2
0   3   10
3   2   15
1   2   30
4   2  100
2   1   20
>>> df.sort(['c1','c2'], ascending=[False,True])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/ampawake/anaconda/envs/pseudo/lib/python2.7/site-packages/pandas/core/generic.py", line 3614, in __getattr__
    return object.__getattribute__(self, name)
AttributeError: 'DataFrame' object has no attribute 'sort'
62
falsetru

يمكن أن يؤدي استخدام sort إلى ظهور رسالة تحذير. انظر جيثب مناقشة. لذلك قد ترغب في استخدام sort_values ، مستندات هنا

ثم يمكن أن يبدو الرمز الخاص بك كما يلي:

df = df.sort_values(by=['c1','c2'], ascending=[False,True])
24
HonzaB

تم إهمال طريقة dataframe.sort () - لذلك فهمي - في الباندا> 0.18. لحل مشكلتك ، يجب عليك استخدام dataframe.sort_values ​​() بدلاً من ذلك:

f.sort_values(by=["c1","c2"], ascending=[False, True])

الإخراج يشبه هذا:

    c1  c2
    3   10
    2   15
    2   30
    2   100
    1   20
8
fotis j

في حالتي ، لم تنجح الإجابة المقبولة:

f.sort_values ​​(بواسطة = ["c1" ، "c2"] ، تصاعدي = [خطأ ، صحيح])

فقط التالية عملت كما هو متوقع:

f = f.sort_values(by=["c1","c2"], ascending=[False, True])
4
Pedro Lobito

إذا كنت تكتب هذا الرمز كملف نصي ، فسيتعين عليك كتابته بالشكل التالي:

df = df.sort(['c1','c2'], ascending=[False,True])
2
Akash

ملاحظة: كل شيء هنا صحيح ، فقط استبدل sort -> sort_values ​​() لذلك ، يصبح:

 import pandas as pd
 df = pd.read_csv('data.csv')
 df.sort_values(ascending=False,inplace=True)

راجع الموقع الرسمي هنا .

1
siddesh chavan

لقد وجدت أن هذا مفيد حقًا:

df = pd.DataFrame({'A' : range(0,10) * 2, 'B' : np.random.randint(20,30,20)})

# A ascending, B descending
df.sort(**skw(columns=['A','-B']))

# A descending, B ascending
df.sort(**skw(columns=['-A','+B']))

لاحظ أنه على خلاف الوسيطات columns=,ascending= القياسية ، توجد هنا أسماء الأعمدة وترتيب الفرز في نفس المكان. نتيجة لذلك ، تصبح قراءة الكود وصيانته أسهل كثيرًا.

لاحظ أن المكالمة الفعلية إلى .sort لم تتغير ، skw ( s ort kw args) هي مجرد وظيفة مساعدة صغيرة تقوم بتوزيع الأعمدة وإرجاع المعلمات columns= و ascending= المعتادة لك. قم بتمرير أي نوع من أنواع الأقواس كما تفعل عادةً. انسخ/الصق الشفرة التالية في على سبيل المثال utils.py المحلي الخاص بك ، ثم نسيانها واستخدامها فقط على النحو الوارد أعلاه.

# utils.py (or anywhere else convenient to import)
def skw(columns=None, **kwargs):
    """ get sort kwargs by parsing sort order given in column name """
    # set default order as ascending (+)
    sort_cols = ['+' + col if col[0] != '-' else col for col in columns]
    # get sort kwargs
    columns, ascending = Zip(*[(col.replace('+', '').replace('-', ''), 
                                False if col[0] == '-' else True) 
                               for col in sort_cols])
    kwargs.update(dict(columns=list(columns), ascending=ascending))
    return kwargs
1
miraculixx