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

如何在Pandas多级列DataFrame中设置mass数组为索引

问题:为Pandas多级列DataFrame设置单一Mass索引并保留列结构

初始代码与输出

以下是生成多级列DataFrame的代码:

import pandas as pd
import numpy as np
from collections import defaultdict

np.random.seed(0)

pd_df = defaultdict(list)
categories = ['cat 1', 'cat 2']
sig_bkgd = ['signal', 'bkgd']
masses = [i for i in range(10, 20)]

for m in masses:
    for cat in categories:
        for sb in sig_bkgd:
            pd_df[(cat, sb)].append(np.random.randint(100))

pd.DataFrame(pd_df)

对应的输出(保留多级列结构):

cat 1       cat 2     
  signal bkgd signal bkgd
0     44   47     64   67
1     67    9     83   21
2     36   87     70   88
3     88   12     58   65
4     39   87     46   88
5     81   37     25   77
6     72    9     20   80
7     69   79     47   64
8     82   99     88   49
9     29   19     19   14

需求

希望将masses数组设置为DataFrame的索引,同时保留上述的多级列结构。

尝试的方法及问题

方法1:添加普通列后设为索引

代码:

pd_df['Mass'] = masses
for m in masses:
    for cat in categories:
        for sb in sig_bkgd:
            pd_df[(cat, sb)].append(np.random.randint(100))

pd.DataFrame(pd_df).set_index("Mass")

问题:生成的DataFrame丢失了多级列结构,列变成了元组形式:

(cat 1, signal)  (cat 1, bkgd)  (cat 2, signal)  (cat 2, bkgd)
Mass                                                                 
10                 44             47               64             67
11                 67              9               83             21
12                 36             87               70             88
13                 88             12               58             65
14                 39             87               46             88
15                 81             37               25             77
16                 72              9               20             80
17                 69             79               47             64
18                 82             99               88             49
19                 29             19               19             14

方法2:添加重复的多级列作为索引

代码:

for m in masses:
    for cat in categories:
        pd_df[(cat, 'mass')].append(m)
        for sb in sig_bkgd:
            pd_df[(cat, sb)].append(np.random.randint(100))

pd.DataFrame(pd_df).set_index([('cat 1', 'mass'), ('cat 2', 'mass')])

问题:索引出现冗余,包含两个重复的mass层级:

cat 1       cat 2     
                            signal bkgd signal bkgd
(cat 1, mass) (cat 2, mass)                        
10            10                44   47     64   67
11            11                67    9     83   21
12            12                36   87     70   88
13            13                88   12     58   65
14            14                39   87     46   88
15            15                81   37     25   77
16            16                72    9     20   80
17            17                69   79     47   64
18            18                82   99     88   49
19            19                29   19     19   14

解决方案

有两种简单的方式可以实现需求:

方式1:先创建DataFrame,再设置索引

先按原逻辑生成多级列的DataFrame,之后直接将masses赋值给索引,无需修改字典:

import pandas as pd
import numpy as np
from collections import defaultdict

np.random.seed(0)

pd_df = defaultdict(list)
categories = ['cat 1', 'cat 2']
sig_bkgd = ['signal', 'bkgd']
masses = [i for i in range(10, 20)]

# 原逻辑生成数据
for m in masses:
    for cat in categories:
        for sb in sig_bkgd:
            pd_df[(cat, sb)].append(np.random.randint(100))

# 创建DataFrame后设置索引
df = pd.DataFrame(pd_df)
df.index = masses
# 可选:给索引命名
df.index.name = 'Mass'

print(df)

输出结果(保留多级列结构,索引为Mass):

cat 1       cat 2     
    signal bkgd signal bkgd
Mass                        
10       44   47     64   67
11       67    9     83   21
12       36   87     70   88
13       88   12     58   65
14       39   87     46   88
15       81   37     25   77
16       72    9     20   80
17       69   79     47   64
18       82   99     88   49
19       29   19     19   14

方式2:创建DataFrame时指定索引

在pd.DataFrame()中直接通过index参数设置:

# 生成数据的逻辑同上...
df = pd.DataFrame(pd_df, index=masses)
df.index.name = 'Mass'

效果和方式1完全一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 19:23:11