其他答案工作正常。根据多索引的结构,直接在关卡上应用地图比构建新的多索引要快得多。
我使用以下函数来修改特定的索引级别。它也适用于单级索引。
def map_index_level(index, mapper, level=0):
"""
Returns a new Index or MultiIndex, with the level values being mapped.
"""
assert(isinstance(index, pd.Index))
if isinstance(index, pd.MultiIndex):
new_level = index.levels[level].map(mapper)
new_index = index.set_levels(new_level, level=level)
else:
# Single level index.
assert(level==0)
new_index = index.map(mapper)
return new_index
用法:
df = pd.DataFrame([[1,2],[3,4]])
df.index = pd.MultiIndex.from_product([["a"],["i","ii"]])
df.columns = ["x","y"]
df.index = map_index_level(index=df.index, mapper=str.upper, level=1)
df.columns = map_index_level(index=df.columns, mapper={"x":"foo", "y":"bar"})
# Result:
# foo bar
# a I 1 2
# II 3 4
注意:上述方法仅在mapper 保留级别值的唯一性时有效!在上面的示例中,mapper = {"i": "new", "ii": "new"} 将在 set_index() 中失败并返回 ValueError: Level values must be unique。可以禁用完整性检查,将上述代码修改为:
new_index = index.set_levels(new_level, level=level,
verify_integrity=False)
但最好不要!请参阅set_levels 的文档。