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
相关产品推荐
相关产品推荐

