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

基于掷骰子结果创建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 19:17:27