如何向空pandas DataFrame追加MultiIndex行并完成对应数值赋值
实现带二级行索引MultiIndex的pandas DataFrame赋值方案
你原有代码存在两个问题:
- 语法错误:Python的
range()参数用逗号分隔,不是冒号,range(3:6)需改为range(3,6),range(6:9)需改为range(6,9) - 赋值逻辑错误:
df.loc[[row_ind1, row_ind2], col]的写法是同时选中行索引为row_ind1和row_ind2的两个独立单行,不是指向二级MultiIndex的组合索引,需改为传入元组(row_ind1, row_ind2)作为行索引标识
方案1:按你要求的三重循环逻辑实现
import pandas as pd # 初始化空DataFrame df = pd.DataFrame() for row_ind1 in range(3): for row_ind2 in range(3, 6): for col in range(6, 9): entry = row_ind1 * row_ind2 * col # 传入元组作为二级行索引标识 df.loc[(row_ind1, row_ind2), col] = entry # 可选操作:给索引加名称、转换列为整数类型(默认赋值会生成float类型) df.index.names = ["row_ind1", "row_ind2"] df = df.astype(int)
输出效果如下,完全符合你期望的结构:
6 7 8 row_ind1 row_ind2 0 3 0 0 0 4 0 0 0 5 0 0 0 1 3 18 21 24 4 24 28 32 5 30 35 40 2 3 36 42 48 4 48 56 64 5 60 70 80
方案2:更高效的向量化实现(适合数据量较大的场景)
不用循环,直接通过numpy广播计算所有值再构建DataFrame:
import pandas as pd import numpy as np # 定义各维度取值范围 ind1 = np.arange(3) ind2 = np.arange(3,6) cols = np.arange(6,9) # 广播计算所有乘积,再重塑为9行3列的二维数组 values = ind1[:, None, None] * ind2[None, :, None] * cols[None, None, :] values = values.reshape(-1, len(cols)) # 构建二级MultiIndex multi_index = pd.MultiIndex.from_product([ind1, ind2], names=["row_ind1", "row_ind2"]) # 生成最终DataFrame df = pd.DataFrame(values, index=multi_index, columns=cols)
内容的提问来源于stack exchange,提问作者mcp
相关产品推荐
相关产品推荐

