如何在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
相关产品推荐
相关产品推荐

