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

如何在Pandas中通过两次GroupBy实现数据转嵌套列表?

实现嵌套列表的二次分组聚合

没问题,这完全可以实现!你已经完成了最关键的第一步,接下来只需要对第一次分组后的结果再做一次聚合就行,我给你两种可行的方法:

方法一:先重置索引再二次分组

这种方法更直观,适合刚接触多层索引的同学:

import pandas as pd

# 构造你的原始DataFrame
df = pd.DataFrame({
    'rule_id': [1,1,1,2,2,2],
    'ordering': [0,1,1,0,1,2],
    'sequence_id': [12,13,14,1,2,12]
})

# 第一次分组:按(rule_id, ordering)聚合sequence_id为列表
first_group = df.groupby(['rule_id', 'ordering'])['sequence_id'].apply(list)

# 重置索引,把多层索引转换成常规列,得到包含sequence_list的DataFrame
first_group_df = first_group.reset_index(name='sequence_list')

# 第二次分组:按rule_id聚合sequence_list,生成嵌套列表
final_result = first_group_df.groupby('rule_id')['sequence_list'].apply(list).reset_index(name='sequences')

print(final_result)

运行后输出的结果就是你想要的格式:

rule_id          sequences
0        1  [[12], [13, 14]]
1        2  [[1], [2], [12]]

方法二:直接在多层索引上二次分组(更高效)

如果想避免额外的DataFrame转换,可以直接利用多层索引的level参数来分组,代码更简洁:

import pandas as pd

df = pd.DataFrame({
    'rule_id': [1,1,1,2,2,2],
    'ordering': [0,1,1,0,1,2],
    'sequence_id': [12,13,14,1,2,12]
})

# 链式调用:第一次分组后,直接按rule_id层级聚合
final_result = (df.groupby(['rule_id', 'ordering'])['sequence_id']
               .apply(list)
               .groupby(level='rule_id')  # 指定按第一层索引(rule_id)分组
               .apply(list)
               .reset_index(name='sequences'))

print(final_result)

这个方法跳过了重置索引的步骤,直接在第一次分组得到的多层索引Series上操作,性能会更优,尤其是处理大数据集的时候。

原理说明

第一次分组后得到的是一个带有rule_id和ordering双层索引的Series,每个索引对应的是该组的sequence_id列表。第二次分组的核心就是把同一个rule_id下的所有列表(对应不同的ordering)收集起来,形成嵌套列表结构,这正是apply(list)在分组后的作用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:07:45