Pandas技术问题:如何重排MultiIndex层级?排序后如何重新编号该层级?
Pandas:重排MultiIndex层级并重新编号指定层级
没问题,针对你已经按letter层级排序后的MultiIndex DataFrame,要给第二个层级重新按组内连续编号(比如每个字母组内从0开始计数),可以用下面的方法轻松实现:
先还原你的示例DataFrame(方便演示)
首先我们先构造出你提供的这个排序后的DataFrame:
import pandas as pd data = {'text': ['blah'] * 9} # 按letter排序后的原始MultiIndex original_index = pd.MultiIndex.from_tuples( [('a', 0), ('a', 3), ('a', 6), ('b', 1), ('b', 4), ('b', 7), ('c', 2), ('c', 5), ('c', 8)], names=['letter', 'num'] ) df = pd.DataFrame(data, index=original_index)
方法1:直接操作MultiIndex生成新编号
利用groupby(level='letter')分组后,用cumcount()生成组内连续序号,再替换原索引:
# 为每个letter组生成从0开始的连续编号 new_num_level = df.groupby(level='letter').cumcount() # 构造新的MultiIndex,保留原letter层级,替换num层级 new_multi_index = pd.MultiIndex.from_arrays( [df.index.get_level_values('letter'), new_num_level], names=['letter', 'num'] ) # 给DataFrame设置新索引 df = df.set_index(new_multi_index)
方法2:先重置索引再重新赋值(更直观)
如果你觉得直接操作索引有点绕,也可以先把索引转成列,处理后再转回MultiIndex:
# 把MultiIndex转成普通列 df_reset = df.reset_index() # 按letter分组后,给num列重新赋值为组内连续序号 df_reset['num'] = df_reset.groupby('letter').cumcount() # 重新设置回MultiIndex df = df_reset.set_index(['letter', 'num'])
最终效果
执行上面任意一种方法后,你的DataFrame会变成这样:
text letter num a 0 blah 1 blah 2 blah b 0 blah 1 blah 2 blah c 0 blah 1 blah 2 blah
如果想要编号从1开始,只需要把cumcount()改成cumcount() + 1就可以啦!
内容的提问来源于stack exchange,提问作者Stephen Frost
相关产品推荐
相关产品推荐

