【问题标题】:Sort and arrange values in dataframe in a specific order按特定顺序对数据框中的值进行排序和排列
【发布时间】:2021-09-23 19:59:33
【问题描述】:

我在数据框中有以下数据

Folder Name   ID     File Name        
Test          2      2_Accounts.csv      
Test          4      4_Contacts.csv         
Test          2      2_Contacts.csv
Test          4      4_Accounts.csv
Test          4      4_Leads.csv
Test          2      2_Leads.csv
Test          2      2_Opps.csv
Test          4      4_Opps.csv

我首先需要按 ID 排序,以便将具有相同值的 ID 分组在一起。 我做了以下

df = df.sort_values("ID")
Folder Name   ID     File Name        
Test          2      2_Leads.csv    
Test          2      2_Accounts.csv         
Test          2      2_Contacts.csv
Test          2      2_Opps.csv
Test          4      4_Accounts.csv
Test          4      4_Opps.csv
Test          4      4_Leads.csv
Test          4      4_Contacts.csv

接下来我需要在groups(id)中进行排序,“联系人”应该排在第一位,“帐户”应该排在第二位,其余的可以按任何顺序排列

应该的输出应该是这样的

Folder Name   ID     File Name        
Test          2      2_Contacts.csv      
Test          2      2_Accounts.csv         
Test          2      2_Opps.csv
Test          2      2_Leads.csv
Test          4      4_Contacts.csv
Test          4      4_Accounts.csv
Test          4      4_Leads.csv
Test          4      4_Opps.csv

【问题讨论】:

    标签: python pandas sorting


    【解决方案1】:

    创建一个临时列来设置自定义顺序:0 -> 联系人,1 -> 客户,* -> 其余的

    df['order'] = df['File Name'].replace({r'Contact': 0,
                                           r'Accounts': 1,
                                           r'.*': 2}, regex=True)
    
    out = df.sort_values(['ID', 'order']).drop(columns='order')
    
    >>> out
      Folder Name  ID       File Name
    2        Test   2  2_Contacts.csv
    0        Test   2  2_Accounts.csv
    5        Test   2     2_Leads.csv
    6        Test   2      2_Opps.csv
    1        Test   4  4_Contacts.csv
    3        Test   4  4_Accounts.csv
    4        Test   4     4_Leads.csv
    7        Test   4      4_Opps.csv
    

    【讨论】:

      【解决方案2】:

      您可以一次对多个列进行排序,以获得您想要的部分。

      df = df.sort_values(by=['ID', 'File Name'])
      

      2_A 出现在 2_C 之前,因此您可以创建一个新列来更改文件名文本以提供您想要的顺序,例如,创建一个删除 2_ 的临时列,然后删除该列,如果你不这样做'不需要它。

      df['sort file name col'] = df['File Name'].str.replace('\\A[0-9]_', '')
      df = df.sort_values(by=['ID', 'sort file name col'])
      del df['sort file name col']
      

      【讨论】:

      • 如何将所有联系人放在首位?
      • 编辑了我的答案
      • 如果列中有5_Cat.csv怎么办?
      • 那么你需要不同的正则表达式或做其他事情。
      【解决方案3】:

      尝试分配一个伪列,强制“联系人”排名高于其他列。 像这样:

      >>> df.assign(file_type=~df["File Name"].str.contains("Contacts")*1) \
            .sort_values(["ID", "file_type"]) \
            .drop("file_type",axis=1) \
            .reset_index(drop=True)
      
        Folder Name  ID       File Name
      0        Test   2  2_Contacts.csv
      1        Test   2  2_Accounts.csv
      2        Test   2     2_Leads.csv
      3        Test   2      2_Opps.csv
      4        Test   4  4_Contacts.csv
      5        Test   4  4_Accounts.csv
      6        Test   4     4_Leads.csv
      7        Test   4      4_Opps.csv
      
      1. 创建一个名为“file_type”的列,如果文件中包含单词“Contacts”,则分配值为 0,否则为 0。
      2. 按“ID”和“file_type”列对数据框进行排序
      3. 删除创建的列
      4. 重置索引

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-05
        • 2020-06-18
        • 2017-04-08
        • 2021-12-07
        • 2016-11-01
        相关资源
        最近更新 更多