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

Pandas多级列索引转换与列结构调整问题咨询

Pandas多级列索引转换与列结构调整问题咨询

嘿,我来帮你搞定这两个Pandas多级索引的问题,一步步拆解哈~


问题1:将Year级列索引转为普通列

你已经通过droplevel去掉了Year级的列索引,但想要把这个Year的值作为新列添加进去,对吧?其实关键是先提取出Year的固定值(因为你的df2是从原多级索引中取的('country2', '2017')这一列,所以Year值统一是2017),再把它作为新列插入即可。

完整代码示例:

import pandas as pd

# 先构造你的df2(还原场景)
df1 = pd.DataFrame(
    data={"data_provider": ["prov_a", "prov_a", "prov_a", "prov_a", "prov_a", "prov_a"],
          "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]}
)

df1MultiIndex = df1.pivot_table(
    index=['data_provider', 'indicator', 'unit'],
    columns='year'
)
df1MultiIndex.columns.names = ['Country', 'Year']
df2 = df1MultiIndex[[('country2', '2017')]]

# ------------------- 核心处理步骤 -------------------
# 1. 提取Year级的固定值(因为所有列的Year都是2017,取唯一值即可)
year_val = df2.columns.get_level_values('Year').unique()[0]

# 2. 去掉Year级列索引
df2.columns = df2.columns.droplevel('Year')

# 3. 添加新列Year,值为刚才提取的2017
df2['Year'] = year_val

# 可选:调整列顺序,把Year放到前面(符合你给出的示例格式)
df2 = df2[['Year', 'country2']]

print(df2)

输出结果:

Year  country2
data_provider indicator unit               
prov_a        ind_a     EUR    2017         4
              ind_b     EUR    2017        40

问题2:调整三级列索引,提取C列为普通列

你的df有三级列索引H,C,T,想要把C级中的5G提取成单独的一列,同时保留T级在对应列的标注,对吧?我们可以先提取C的固定值,添加为新列,再重构列索引来匹配你想要的格式。

完整代码示例:

import pandas as pd

# 构造你的df(还原场景)
dict_data = {('D', '', ''): {1: '10%', 4: '30%'},
             ('P', '', ''): {1: 'Sugar', 4: 'Sugar'},
             ('t', '', ''): {1: 'Salt', 4:'Salt'},
             ('ra', '5G', 'W'): {1: '35%', 4:'28%'},
             ('rb', '5G', 'W'): {1: '-10%', 4:'30%'},
             ('sc', '5G', 'W'): {1: '-10%', 4:'25%'}}

df = pd.DataFrame.from_dict(dict_data)
df.columns.names = ['H', 'C', 'T']

# ------------------- 核心处理步骤 -------------------
# 1. 提取C级的固定值(这里是'5G',排除空值的唯一值)
c_val = df.columns.get_level_values('C').unique()[1]

# 2. 添加新列C,值为提取到的5G
df['C'] = c_val

# 3. 调整列顺序,把C放到t和ra之间
new_col_order = ['D', 'P', 't', 'C', 'ra', 'rb', 'sc']
df = df[new_col_order]

# 4. 重构多级列索引:第一级为H,第二级为T(无值则为空)
new_col_tuples = []
for col in new_col_order:
    # 对于ra/rb/sc,取原T级的W;其他列T为空
    if col in ['ra', 'rb', 'sc']:
        t_val = df.columns.get_level_values('T')[df.columns.get_level_values('H') == col][0]
    else:
        t_val = ''
    new_col_tuples.append( (col, t_val) )

df.columns = pd.MultiIndex.from_tuples(new_col_tuples, names=['H', 'T'])

print(df)

输出结果:

H    D      P     t  C  ra    rb    sc
T                        W     W     W
1  10%  Sugar  Salt  5G  35%  -10%  -10%
4  30%  Sugar  Salt  5G  28%   30%   25%

备注:内容来源于stack exchange,提问作者missmango

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 07:48:04