【问题标题】:Reorder rows of Pandas dataframe using custom order over multiple columns使用多列的自定义顺序重新排序 Pandas 数据框的行
【发布时间】:2021-09-08 13:34:13
【问题描述】:

我想根据多列的自定义顺序对数据框的行重新排序。

说,我有以下df

import pandas as pd
df = pd.DataFrame.from_dict({'Name': {0: 'Tim', 1: 'Tim', 2: 'Tim', 3: 'Ari', 4: 'Ari', 5: 'Ari', 6: 'Dan', 7: 'Dan', 8: 'Dan'}, 'Subject': {0: 'Math', 1: 'Science', 2: 'History', 3: 'Math', 4: 'Science', 5: 'History', 6: 'Math', 7: 'Science', 8: 'History'}, 'Test1': {0: 10, 1: 46, 2: 54, 3: 10, 4: 83, 5: 39, 6: 10, 7: 58, 8: 10}, 'Test2': {0: 5, 1: 78, 2: 61, 3: 7, 4: 32, 5: 43, 6: 1, 7: 28, 8: 50}})

看起来像这样

Name  Subject  Test1  Test2
Tim     Math     10      5
Tim  Science     46     78
Tim  History     54     61
Ari     Math     10      7
Ari  Science     83     32
Ari  History     39     43
Dan     Math     10      1
Dan  Science     58     28
Dan  History     10     50

我想先按照自定义顺序['Dan','Tim','Ari']Name排序,然后按照自定义顺序['Science','History','Math']Subject排序。

所以我最终的df 应该是这样的

Name  Subject  Test1  Test2
Dan  Science     58     28
Dan  History     10     50
Dan     Math     10      1
Tim  Science     46     78
Tim  History     54     61
Tim     Math     10      5
Ari  Science     83     32
Ari  History     39     43
Ari     Math     10      7

这似乎是一件简单的事情,但我不知道该怎么做。我能找到的最接近的解决方案是如何根据单个列 here 自定义重新排序行。我希望能够同时为多个列执行此操作。

【问题讨论】:

    标签: python pandas sorting


    【解决方案1】:

    您可以将NameSubject 表示为分类变量:

    names = ['Dan','Tim','Ari']
    subjects = ['Science','History','Math']
    
    df = df.astype({'Name': pd.CategoricalDtype(names, ordered=True),
                    'Subject': pd.CategoricalDtype(subjects, ordered=True)})
    
    >>> df.sort_values(['Name', 'Subject'])
      Name  Subject  Test1  Test2
    7  Dan  Science     58     28
    8  Dan  History     10     50
    6  Dan     Math     10      1
    1  Tim  Science     46     78
    2  Tim  History     54     61
    0  Tim     Math     10      5
    4  Ari  Science     83     32
    5  Ari  History     39     43
    3  Ari     Math     10      7
    
    >>> df.sort_values(['Subject', 'Name'])
      Name  Subject  Test1  Test2
    7  Dan  Science     58     28
    1  Tim  Science     46     78
    4  Ari  Science     83     32
    8  Dan  History     10     50
    2  Tim  History     54     61
    5  Ari  History     39     43
    6  Dan     Math     10      1
    0  Tim     Math     10      5
    3  Ari     Math     10      7
    

    【讨论】:

      【解决方案2】:

      您可以创建 2 个临时列进行排序,然后在对 df 进行排序后删除它们。

      (
          df.assign(key1=df.Name.map({'Dan':0, 'Tim':1, 'Ari':2}), 
                    key2=df.Subject.map({'Science':0, 'History':1, 'Math':2}))
          .sort_values(['key1', 'key2'])
          .drop(['key1', 'key2'], axis=1)
      )
      

      【讨论】:

        猜你喜欢
        • 2014-12-20
        • 2021-12-01
        • 2022-10-13
        • 2021-10-03
        • 2023-02-02
        • 2023-02-07
        • 2021-09-17
        • 2021-03-27
        • 1970-01-01
        相关资源
        最近更新 更多