为MultiIndex序列添加新索引列并通过部分标签匹配重索引
嘿,我来帮你搞定这两个Pandas索引相关的需求,一步步来哈:
需求1:为MultiIndex序列添加新索引列"zero"
咱们要给MultiIndex序列新增一个名为"zero"的索引层级,有两种直观的实现方式,选你顺手的来:
方式一:直接操作MultiIndex层级
不用转成DataFrame,直接在原索引基础上扩展层级:
import pandas as pd import numpy as np # 先把你给出的原序列初始化代码放这,方便直接运行 arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'], ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']] tuples = list(zip(*arrays)) index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second']) s = pd.Series(np.random.randn(8), index=index) # 准备"zero"层级的标签,这里用分组示例,你可以换成自己需要的值 zero_labels = ['grp1', 'grp1', 'grp1', 'grp1', 'grp2', 'grp2', 'grp2', 'grp2'] # 把新层级和原索引的层级组合成新的MultiIndex new_multi_index = pd.MultiIndex.from_arrays( [zero_labels] + list(s.index.levels), names=['zero', 'first', 'second'] ) # 给原序列设置新索引 s_with_zero = s.reindex(new_multi_index)
方式二:转成DataFrame操作(新手友好版)
先把Series转成DataFrame,添加列后再重新设置MultiIndex,逻辑更清晰:
# 原序列初始化代码同上,直接用已创建的s df = s.reset_index() # 把原索引转成普通列 df['zero'] = ['X', 'X', 'Y', 'Y', 'X', 'X', 'Y', 'Y'] # 添加新的"zero"列 df = df.set_index(['zero', 'first', 'second']) # 重新设置包含zero的MultiIndex # 如果需要转回Series的话 s_with_zero = df.iloc[:, 0]
需求2:添加索引列并通过匹配部分索引标签对DataFrame进行重索引
假设我们已经完成了需求1,得到了带zero层级的DataFrame(就用上面的df为例),下面分两种常见场景实现部分标签匹配的重索引:
场景1:指定具体的索引标签组合
比如我们想只保留或新增zero='grp1'且first='bar'的所有行,或者指定几个具体的索引元组:
# 定义目标索引的元组列表,自由组合你需要匹配的标签 target_index_tuples = [('grp1', 'bar', 'one'), ('grp1', 'bar', 'two'), ('grp2', 'foo', 'one')] # 创建目标MultiIndex target_index = pd.MultiIndex.from_tuples(target_index_tuples, names=['zero', 'first', 'second']) # 重索引,缺失行默认填充NaN,可用fill_value参数设置自定义填充值(比如0) df_reindexed = df.reindex(target_index, fill_value=0)
场景2:匹配某几个层级的所有可能标签
比如想匹配zero='grp1'且first='baz'的所有second层级标签,用IndexSlice会更灵活:
idx = pd.IndexSlice # 筛选出符合条件的现有索引 selected_index = df.index[idx['grp1', 'baz', :]] # 用这些索引重索引 df_reindexed = df.reindex(selected_index)
如果是想新增部分匹配的索引项(比如原数据没有的('grp1', 'bar', 'three')),直接把新元组加到索引列表里就行:
new_index_tuples = list(df.index) + [('grp1', 'bar', 'three')] df_reindexed = df.reindex(new_index_tuples)
内容的提问来源于stack exchange,提问作者xiaoshir
相关产品推荐
相关产品推荐

