You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于列名规则为含行MultiIndex的Pandas DataFrame创建列MultiIndex

Pandas行MultiIndex DataFrame转换为行列双MultiIndex结构

初始DataFrame

我们从一个仅行级为MultiIndex的DataFrame开始,代码如下:

import numpy as np
import pandas as pd

arrays = [np.array(["berlin", "berlin", "paris", "paris", "rome", "rome", "seville", "seville"]),
          np.array(["one", "two", "one", "two", "one", "two", "one", "two"])]
df = pd.DataFrame(np.random.randn(8, 4), index=arrays, columns=['mike','ana','manu','analia'])

转换要求

需要将上述DataFrame转换为同时包含列级MultiIndex的结构,列的层级归属由以下函数判定:

def sortit(colname):
    if colname.startswith('m'):
        return 'm'
    else:  # 修正原函数重复判断的逻辑错误
        return 'a'

实现方案

直接一次性创建列级MultiIndex,避免重复调用耗时的判定逻辑,代码如下:

import numpy as np
import pandas as pd

# 保留原行级MultiIndex并添加名称
arrays = [np.array(["berlin", "berlin", "paris", "paris", "rome", "rome", "seville", "seville"]),
          np.array(["one", "two", "one", "two", "one", "two", "one", "two"])]
tuples_i = list(zip(*arrays))
index_rows = pd.MultiIndex.from_tuples(tuples_i, names=["city", "number"])

# 基于判定逻辑生成列级MultiIndex的层级数据
dept_level = [sortit(col) for col in df.columns]
name_level = df.columns.tolist()

# 创建列级MultiIndex
tuples_c = list(zip(dept_level, name_level))
index_columns = pd.MultiIndex.from_tuples(tuples_c, names=["department", "name"])

# 生成目标DataFrame(复用原数据而非重新生成随机数)
df = pd.DataFrame(df.values, index=index_rows, columns=index_columns)
print(df)

注:代码中复用了原DataFrame的原始数据,而非重新生成随机数,更贴合实际转换场景。

关键注意事项

  • 初始状态固定为仅行级含MultiIndex的DataFrame,不可更改;
  • 实际场景中列层级判定逻辑复杂且耗时,必须一次性构建列MultiIndex,避免重复计算,提升后续查询性能。

内容的提问来源于stack exchange,提问作者JFerro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 01:40:41