根据列名重新排序 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)
我有一些名称相似但数字后缀代表每列不同出现的列。例如,我有列(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)