基于掷骰子结果创建Pandas多层索引DataFrame的方法
实现建议与完整代码
要生成你需要的多层索引DataFrame,核心是先记录每次掷骰子的两个单独点数(而非仅保存总和),再通过多层列索引合并numpy和pandas的结果。以下是具体实现步骤和代码:
步骤1:修改数据生成逻辑,保存单次掷骰子的两个点数
原代码仅计算了总和,需调整为记录每次掷出的两个骰子值,再衍生出总和列:
import pandas as pd import numpy as np throws = 50 diepd = pd.DataFrame([1, 2, 3, 4, 5, 6]) dienp = np.array([1,2,3,4,5,6]) np.random.seed(1) # 生成numpy的每次掷骰子数据:(50,2)的数组,每行对应两个骰子点数 np_throws = np.random.choice(dienp, size=(throws, 2), replace=True) df_np = pd.DataFrame(np_throws, columns=['throw1', 'throw2']) df_np['sum'] = df_np.sum(axis=1) # 生成pandas的每次掷骰子数据 pd_throws = [] for _ in range(throws): sample = diepd.sample(2, replace=True).values.flatten().tolist() pd_throws.append(sample) df_pd = pd.DataFrame(pd_throws, columns=['throw1', 'throw2']) df_pd['sum'] = df_pd.sum(axis=1)
步骤2:构造多层列索引并合并数据
用pd.MultiIndex.from_product快速生成两层列索引,再合并两个结果DataFrame:
# 构造多层列索引:第一层为工具类型,第二层为数据项 multi_cols = pd.MultiIndex.from_product( [['numpy结果', 'pandas结果'], ['throw1', 'throw2', 'sum']], names=['工具', '数据项'] ) # 合并数据并匹配多层列索引 result = pd.concat([df_np, df_pd], axis=1) result.columns = multi_cols # 设置行索引为1到50的掷骰子次数 result.index = range(1, throws+1) result.index.name = 'No.' # 查看前3行结果 print(result.head(3))
关键说明
- numpy部分直接生成
(throws,2)的数组,比列表推导更高效,也便于后续处理。 - pandas的sample结果通过
values.flatten()快速提取两个点数,避免冗余索引操作。 pd.MultiIndex.from_product是生成多层列索引的简洁方式,适配“分组+子项”的结构。- 最终行索引设置为1开始的连续整数,并命名为
No.,完全匹配你期望的表格结构。
运行代码后,你将得到符合需求的多层索引DataFrame,可同时对比每次掷骰子的单独点数与总和差异。
内容的提问来源于stack exchange,提问作者AndysPythonStuff
相关产品推荐
相关产品推荐

