You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅指定值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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 23:03:15