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

如何在Pandas中迭代创建兼具多级索引与多级列的DataFrame

如何同时创建多级行索引和多级列的Pandas DataFrame

嘿,这个问题其实不难,咱们一步步来搞定它!你已经知道怎么单独创建多级索引或多级列的DataFrame,现在要把两者结合起来,核心是先明确行索引的层级结构和列的层级结构,再把收集到的单行数据对应进去。

方法一:先收集所有数据再一次性创建(推荐,效率更高)

如果你已经把所有行数据收集好了,这种方法更高效:

1. 准备行数据

首先把你要的所有行整理成列表,注意补全缺失的索引项(比如你示例里第二行的Earth我补上了,不然索引层级会不完整):

import numpy as np
import pandas as pd

# 收集所有行数据,每个数组前3项是索引,后面是X/Y的A/B/C/D数值(这里我补了Y的示例数值)
rows = [
    np.array(['Earth', 'Europe', 'England', 0.3, 0.5, 0.6, 0.8, 0.4, 0.6, 0.7, 0.9]),
    np.array(['Earth', 'Europe', 'Italy', 0.1, 0.2, 0.4, 1.2, 0.2, 0.3, 0.5, 1.3]),
    np.array(['Mars', 'Tempe', 'Sirtys', 3.2, 4.5, 2.3, 4.2, 3.3, 4.6, 2.4, 4.3])
]

2. 拆分索引和数值部分

把每行的索引项和数值项分开,同时把数值转成浮点型:

# 转换成二维数组
data = np.vstack(rows)
# 提取索引部分(前3列)和数值部分(后8列)
index_data = data[:, :3]
values_data = data[:, 3:].astype(float)

3. 创建多级行索引

用from_arrays把索引数据转换成三级索引,同时指定索引名称:

multi_index = pd.MultiIndex.from_arrays(
    index_data.T,  # 转置后每一行对应一个索引层级
    names=['Planet', 'Continent', 'Country']
)

4. 创建多级列

用from_product生成X/Y下分A/B/C/D的两级列索引:

multi_columns = pd.MultiIndex.from_product(
    [['X', 'Y'], ['A', 'B', 'C', 'D']],  # 第一级是X/Y,第二级是A/B/C/D
    names=['Category', 'Metric']
)

5. 生成最终DataFrame

把索引、列和数值组合起来:

df = pd.DataFrame(values_data, index=multi_index, columns=multi_columns)

运行后你就能得到同时拥有三级行索引和两级列索引的DataFrame了!


方法二:迭代添加单行数据(适合数据量小的场景)

如果你需要逐行迭代添加,可以用_append(Pandas 2.0+推荐,原append已弃用),核心是给每行的name设置成索引元组,同时用预先定义好的多级列:

import pandas as pd

# 预先定义多级列结构
multi_columns = pd.MultiIndex.from_product(
    [['X', 'Y'], ['A', 'B', 'C', 'D']],
    names=['Category', 'Metric']
)

# 初始化空DataFrame
df = pd.DataFrame(columns=multi_columns)

# 逐行添加,注意每行的name是对应三级索引的元组
row1 = pd.Series(
    [0.3, 0.5, 0.6, 0.8, 0.4, 0.6, 0.7, 0.9],
    index=multi_columns,
    name=('Earth', 'Europe', 'England')
)
df = df._append(row1)

row2 = pd.Series(
    [0.1, 0.2, 0.4, 1.2, 0.2, 0.3, 0.5, 1.3],
    index=multi_columns,
    name=('Earth', 'Europe', 'Italy')
)
df = df._append(row2)

row3 = pd.Series(
    [3.2, 4.5, 2.3, 4.2, 3.3, 4.6, 2.4, 4.3],
    index=multi_columns,
    name=('Mars', 'Tempe', 'Sirtys')
)
df = df._append(row3)

# 最后给索引设置名称
df.index.names = ['Planet', 'Continent', 'Country']

关键注意点

  • 多级索引的每个标签必须是元组(比如('Earth', 'Europe', 'England')),这样Pandas才能识别出层级。
  • 数值部分要确保是数值类型(比如用astype(float)转换),避免出现object类型影响后续计算。
  • 如果你的Y列暂时没有数据,可以用np.nan填充,不影响结构创建。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 13:47:41