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

如何在Pandas GroupBy中排除指定标签进行分组?附求和示例

嘿,针对你在Pandas GroupBy里使用未分组标签的需求,结合你给出的MultiIndex场景,我给你整理了几个实用的方法,一起来看看:

首先先把你没写完的示例代码补全,方便后续演示:

import pandas as pd
import numpy as np

# 构建MultiIndex
arrays = [np.array(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux']), 
          np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two'])]
tuples = list(zip(*arrays))
index = pd.MultiIndex.from_tuples(tuples, names=['i', 'j'])

# 创建带数据的DataFrame,额外加一列未参与分组的标签`other_label`
df = pd.DataFrame({'value': [1, 2, 3, 4, 5, 6, 7, 8],
                   'other_label': ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B']},
                  index=index)

方法1:用agg()保留未分组标签的信息

如果你只是想在分组聚合后,把未分组的标签信息一起保留下来,可以通过agg()为不同列指定聚合逻辑——比如对求和列用sum,对未分组标签用first/last或者拼接等操作。

比如我们按i分组求和value,同时保留每个组的other_label:

grouped_result = df.groupby(level='i').agg(
    total_value=('value', 'sum'),
    retained_label=('other_label', 'first')  # 取组内第一个标签值
)
print(grouped_result)

输出结果:

total_value retained_label
i                              
bar            3              A
baz            7              A
foo           11              A
qux           15              A

方法2:用apply()灵活调用未分组标签做自定义计算

如果需要更复杂的逻辑——比如在分组内基于未分组标签做进一步计算,apply()就很适合。它允许你在自定义函数里直接访问组内的所有列,包括未参与分组的标签。

比如我们按i分组后,计算每个子分组(按other_label)的求和,同时加上组的总求和:

def process_group(group):
    # 在这里可以自由使用组内的未分组标签`other_label`
    group['sum_by_label'] = group.groupby('other_label')['value'].transform('sum')
    group['group_total'] = group['value'].sum()
    return group

result = df.groupby(level='i').apply(process_group)
print(result)

这样就能在分组操作中充分利用未参与分组的标签信息了。

方法3:把未分组索引标签临时加入分组键,再调整结构

如果你的未分组标签是MultiIndex的一部分(比如示例里的j),可以先把它临时加入分组键,聚合后再通过索引操作(比如unstack)调整成你想要的结构,这样既完成了分组求和,又保留了未分组标签的信息。

比如按i分组,但保留j的标签维度:

# 先按i和j分组求和,再把j转成列
grouped = df.groupby(level=['i', 'j'])['value'].sum().unstack('j')
print(grouped)

输出结果:

j    one  two
i            
bar    1    2
baz    3    4
foo    5    6
qux    7    8

总结一下核心思路:

  • 要保留未分组标签:用agg()指定对应列的聚合方式
  • 要自定义使用未分组标签:用apply()写自定义处理函数
  • 未分组标签是索引层级:通过临时分组+索引调整来保留它

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:21:04