Python中pandas的groupby操作如何为原始数据添加多级索引键?

有一个形如以下的学生成绩表,求男同学和女同学的平均成绩:

''' frame=pd.DataFrame({'姓名':['甲','乙','丙','丁','戊','己','庚'], '成绩':range(70,0,-10), '性别':['男','男','男','女','女','女','女'], 'd':[0,1,2,0,1,2,3] }) '''

其结构如下: d 姓名 性别 成绩 0 0 甲 男 70 1 1 乙 男 60 2 2 丙 男 50 3 0 丁 女 40 4 1 戊 女 30 5 2 己 女 20 6 3 庚 女 10

''' #转换成多级索引

frame2=frame.set_index(['性别','d'])

#以性别分组求平均

frame2.groupby('性别').mean() '''

结果如下

Out[60]: 成绩 性别
女 25 男 60

以上步骤基本会做了,但是………………

我的疑惑是,如果原始数据中没有 d 列,仅仅是一个最常见的学生成绩表:

''' frame=pd.DataFrame({'姓名':['甲','乙','丙','丁','戊','己','庚'], '成绩':range(70,0,-10), '性别':['男','男','男','女','女','女','女'], }) '''

这种情况,如何添加 d 列,如果成绩表数据较多,总不可能人工去数数添加吧?

初学,我的理解是没有多级索引 key,就没办法使用 groupby。

如何给没有多级索引 key 的原始数据,添加上去呢??


Python中pandas的groupby操作如何为原始数据添加多级索引键?

3 回复

groupby 跟索引没关系。


在pandas里,用groupby分组后想给原始数据加上多级索引键,最直接的办法是用transform。比如你按['A', 'B']两列分组,想给每行加上对应的分组键,可以这么干:

import pandas as pd

# 示例数据
df = pd.DataFrame({
    'A': ['foo', 'foo', 'bar', 'bar', 'foo'],
    'B': ['one', 'two', 'one', 'two', 'one'],
    'C': [1, 2, 3, 4, 5],
    'D': [10, 20, 30, 40, 50]
})

# 分组并添加分组键到原始数据
group_keys = df.groupby(['A', 'B']).ngroup()
df['group_key'] = group_keys

# 或者分别添加每级索引
for i, col in enumerate(['A', 'B']):
    df[f'group_{col}'] = df.groupby(['A', 'B'])[col].transform('first')

print(df)

如果你想要的是分组后直接修改索引,可以这样:

# 方法1:分组后重置索引,把分组键变成列
grouped = df.groupby(['A', 'B']).sum()
result = grouped.reset_index()

# 方法2:设置多级索引
df_multiindex = df.set_index(['A', 'B'])

关键看你是要在原始数据里加列,还是要改索引结构。transform适合前者,set_index适合后者。

总结:用transform加列,用set_index改索引。

groupby 聚合数据 比如:[‘甲’,‘乙’,‘丙’,‘丁’,‘戊’,‘己’,‘庚’] 6 位同学,3 男 3 女 ,你想看男的都有谁,data.groupby[‘男’]

回到顶部