根据列名重新排序 Pandas 列

Reordering Pandas Columns based on Column name

我有一些名称相似但数字后缀代表每列不同出现的列。例如,我有列(company_1、job_title_1、location_1、company_2、job_title_2、location_2)。我想将这些列按前缀(下划线之前)分组在一起,然后按后缀(下划线之后)顺序分组。

我希望这些列是:company_1、company_2、job_title_1、job_title_2、location_1、location_2。

这是我从 this question 中尝试的:

df = df.reindex(sorted(df.columns), axis=1)

这导致顺序:company_1、company_10、company_11(跳过 2-9)

这种排序称为自然排序。 (链接副本中的完整详细信息

通过natsort

import pandas as pd
from natsort import natsorted

df = pd.DataFrame(columns=[f'company_{i}' for i in [5, 2, 3, 4, 1, 10]])

print(df)

排序前:

Empty DataFrame
Columns: [company_5, company_2, company_3, company_4, company_1, company_10]
Index: []

自然分类:

df = df.reindex(natsorted(df.columns), axis=1)
Empty DataFrame
Columns: [company_1, company_2, company_3, company_4, company_5, company_10]
Index: []

字典排序用sorted:

df = df.reindex(sorted(df.columns), axis=1)
Empty DataFrame
Columns: [company_1, company_10, company_2, company_3, company_4, company_5]
Index: []

为了完整起见,您还可以通过将函数传递给 sorted 将字符串拆分为 name, index 个元组来获得所需的结果。


def index_splitter(x):
    """Example input: 'job_title_1'
       Output: ('job_title', 1)
    """
    *name, index = x.split("_")
    return '_'.join(name), int(index)

df = df.reindex(sorted(df.columns, key=index_splitter), axis=1)