Reindex Series输出与Pandas文档示例不符及格式转换求助
看起来你是想自定义多层索引Series的顺序,对吧?原Series的索引是按Age_cat分组,每组下按Male、Female、All排列,而你想要调整这个顺序,甚至可能修改部分索引标签。下面给你两种场景的解决方案:
场景1:仅调整索引的排列顺序
如果只是想改变现有索引对的显示顺序,不需要修改标签,直接构造目标索引列表再用reindex就可以:
import pandas as pd # 定义你想要的完整索引顺序(按你的目标片段补全) target_index_pairs = [ ('_1', 'Male'), ('_1', 'Female'), ('_1', 'All'), # 这里假设你是笔误把_1写成了_2,若确实要放_2下,直接改这里的第一个元素即可 ('_2', 'Male'), ('_2', 'Female'), ('_2', 'All'), ('All', 'Male'), ('All', 'Female'), ('All', 'All') ] # 转换为和原索引名称一致的MultiIndex对象 target_multi_index = pd.MultiIndex.from_tuples( target_index_pairs, names=['Age_cat', 'S0102_gender'] ) # 执行重新索引 aStack_reindexed = aStack.reindex(target_multi_index) # 查看调整后的结果 print(aStack_reindexed)
执行后,Series就会按照你指定的索引顺序排列,每个索引对应的值会和原Series中匹配的索引保持一致。
场景2:需要修改部分索引标签并调整顺序
如果你的目标里_2 All 378.340134是想把原_1分组下的All项移到_2分组下,那需要先修改索引标签,再调整顺序:
import pandas as pd # 第一步:复制原索引并修改指定标签 new_index = aStack.index.copy() # 定位原('_1', 'All')的索引位置,将其Age_cat改为'_2' mask = (new_index.get_level_values('Age_cat') == '_1') & (new_index.get_level_values('S0102_gender') == 'All') updated_age_cats = ['_2' if flag else val for val, flag in zip(new_index.get_level_values('Age_cat'), mask)] new_index = new_index.set_levels(updated_age_cats, level='Age_cat') # 第二步:给Series设置修改后的新索引 aStack_updated = aStack.set_index(new_index) # 第三步:按你想要的最终顺序重新索引 final_target_pairs = [ ('_1', 'Male'), ('_1', 'Female'), ('_2', 'All'), ('_2', 'Male'), ('_2', 'Female'), ('_2', 'All'), ('All', 'Male'), ('All', 'Female'), ('All', 'All') ] final_target_index = pd.MultiIndex.from_tuples( final_target_pairs, names=['Age_cat', 'S0102_gender'] ) aStack_final = aStack_updated.reindex(final_target_index) # 查看最终结果 print(aStack_final)
这样处理后,原_1下的All项就会变成_2下的All,并且按照你指定的顺序排列。需要注意的是,如果目标索引中有重复的索引对(比如两个('_2', 'All')),Pandas会保留所有匹配项,对应的值分别来自原Series中对应的索引项。
内容的提问来源于stack exchange,提问作者user204548
相关产品推荐
相关产品推荐

