如何仅指定值2,对DataFrame二级列标签对应列进行排序?
问题描述
现有如下示例DataFrame:
import pandas as pd df3 = pd.DataFrame( data={"data_provider": ["prov_1", "prov_1", "prov_2", "prov_2", "prov_3", "prov_3"], "indicator": ["ind_a", "ind_a", "ind_a", "ind_b", "ind_b", "ind_b"], "unit": ["EUR", "EUR", "EUR", "EUR", "EUR", "EUR"], "year": ["2017", "2018","2019", "2017","2018","2019"], "country1": [1, 2, 3, 2, 4, 6], "country2": [4, 5, 6, 40, 50, 60]} ) df = pd.pivot_table(data=df3, index=['data_provider', 'indicator'], columns=['year', 'country1'], fill_value=30)
生成的多层列结构如下:
country2 year 2017 2018 2019 country1 1 2 2 4 3 6 data_provider indicator prov_1 ind_a 4 30 5 30 30 30 prov_2 ind_a 30 30 30 30 6 30 ind_b 30 40 30 30 30 30 prov_3 ind_b 30 30 30 50 30 60
经过以下筛选:
dffiltered = df[(df[('country2', '2017', 2)] <= 30) & (df[('country2', '2018', 2)] <= 30)]
得到筛选后的DataFrame:
country2 year 2017 2018 2019 country1 1 2 2 4 3 6 data_provider indicator prov_1 ind_a 4 30 5 30 30 30 prov_2 ind_a 30 30 30 30 6 30 prov_3 ind_b 30 30 30 50 30 60
当前排序需要手动指定完整列名:
dfsorted = dffiltered.sort_values([('country2', '2017', 2), ('country2', '2018', 2)], ascending=[False, False])
需求:是否可以仅指定country1=2这个条件,自动匹配所有对应列完成排序,无需手动列出完整列名?
解决方案
方法1:批量筛选目标列(仅指定country1=2)
利用多层列的层级筛选功能,自动找出所有country1=2的列:
# 获取所有第三层级(country1)为2的列 sort_columns = dffiltered.columns[dffiltered.columns.get_level_values(2) == 2] # 按这些列降序排序 dfsorted = dffiltered.sort_values(by=sort_columns.tolist(), ascending=False)
注:列层级索引从0开始,get_level_values(2)对应第三层的country1标签;若所有列排序方向一致,直接传ascending=False即可,无需按列数生成列表。
方法2:带额外条件的灵活筛选
如果需要同时限定其他层级(比如仅用2017、2018年的列),可以用列表推导式精准匹配:
# 筛选country1=2且year在指定范围内的列 sort_columns = [col for col in dffiltered.columns if col[2] == 2 and col[1] in ("2017", "2018")] dfsorted = dffiltered.sort_values(by=sort_columns, ascending=[False, False])
这种方式可根据需求组合多个层级的筛选条件,同样无需手动输入完整列名。
内容的提问来源于stack exchange,提问作者missmango
相关产品推荐
相关产品推荐

