在Pandas的数据处理场景中,MultiIndex(多级索引)可以让DataFrame支持更灵活的分层数据结构,很多时候我们需要手动指定MultiIndex的具体值来满足业务需求,下面介绍几种常见的操作方式。

从零创建DataFrame时直接指定MultiIndex
如果需要在新建DataFrame的时候就设置好MultiIndex,可以通过pd.MultiIndex.from_tuples或者pd.MultiIndex.from_product来生成多级索引对象,再赋值给DataFrame的index参数。
使用from_tuples指定自定义索引元组
当我们已经有明确的多级索引组合时,可以用from_tuples方法,传入包含元组的列表,每个元组对应一行数据的多级索引值。
import pandas as pd
import numpy as np
# 定义两级索引的元组列表,第一级是部门,第二级是员工
index_tuples = [('技术部', '张三'), ('技术部', '李四'), ('产品部', '王五'), ('产品部', '赵六')]
multi_index = pd.MultiIndex.from_tuples(index_tuples, names=['部门', '姓名'])
# 创建带MultiIndex的DataFrame
df = pd.DataFrame(
data=np.random.randint(80, 100, size=(4, 2)),
index=multi_index,
columns=['绩效分', '出勤天数']
)
print(df)
使用from_product生成笛卡尔积索引
如果多级索引的每一层都是独立的取值集合,需要生成所有组合的情况,可以用from_product方法,传入每层索引的取值列表即可。
import pandas as pd
import numpy as np
# 第一层索引:季度,第二层索引:月份
quarters = ['Q1', 'Q2']
months = ['1月', '2月', '3月']
# 生成笛卡尔积形式的多级索引
multi_index = pd.MultiIndex.from_product([quarters, months], names=['季度', '月份'])
# 创建DataFrame
df = pd.DataFrame(
data=np.random.randint(100, 200, size=(6, 1)),
index=multi_index,
columns=['销售额']
)
print(df)
为已有的DataFrame指定MultiIndex
如果已经存在一个普通索引的DataFrame,想要将其转换为带MultiIndex的结构,可以通过set_index方法指定多个列作为索引层级。
import pandas as pd
# 原始DataFrame,包含普通列
data = {
'省份': ['广东', '广东', '浙江', '浙江'],
'城市': ['广州', '深圳', '杭州', '宁波'],
'GDP': [28839, 32388, 18753, 15704]
}
df = pd.DataFrame(data)
# 指定省份和城市两列作为MultiIndex
df_multi = df.set_index(['省份', '城市'])
print(df_multi)
如果需要调整索引层级的顺序,可以给set_index传入append参数,或者后续用reorder_levels方法调整。
import pandas as pd
data = {
'省份': ['广东', '广东', '浙江', '浙江'],
'城市': ['广州', '深圳', '杭州', '宁波'],
'GDP': [28839, 32388, 18753, 15704]
}
df = pd.DataFrame(data)
# 先设置城市为索引,再追加省份为第二级索引
df_multi = df.set_index('城市', append=False).set_index('省份', append=True)
# 调整层级顺序,把省份放到第一层,城市放到第二层
df_multi = df_multi.reorder_levels(['省份', '城市'])
print(df_multi)
修改已有MultiIndex的具体值
如果需要修改已经存在的MultiIndex中某一层级的取值,可以通过set_levels方法或者直接操作索引的levels属性实现。
import pandas as pd
import numpy as np
# 先创建一个带MultiIndex的DataFrame
index_tuples = [('A', 'a'), ('A', 'b'), ('B', 'a'), ('B', 'b')]
multi_index = pd.MultiIndex.from_tuples(index_tuples, names=['大类', '小类'])
df = pd.DataFrame(np.random.randn(4, 1), index=multi_index, columns=['数值'])
# 修改第一层索引的取值,把A改成类别1,B改成类别2
df.index = df.index.set_levels(['类别1', '类别2'], level=0)
print(df)
# 也可以修改某一层级的单个值,比如把小类的a改成x
new_levels = df.index.levels[1].tolist()
new_levels[new_levels.index('a')] = 'x'
df.index = df.index.set_levels(new_levels, level=1)
print(df)
注意事项
- 指定MultiIndex时,索引的长度必须和DataFrame的行数完全匹配,否则会抛出维度不匹配的错误。
- 使用
set_index方法时,被指定为索引的列会从DataFrame的列中移除,如果需要保留原列,可以设置drop=False参数。 - 修改MultiIndex的层级值时,新的值需要和原层级的类型兼容,比如原层级是字符串类型,不要传入数值类型的值,避免出现类型错误。
PandasDataFrameMultiIndex数据索引修改时间:2026-07-07 19:00:24