如何在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
相关产品推荐
相关产品推荐

