0

0

如何根据分组列的最后一个值对 DataFrame 进行二次分组

花韻仙語

花韻仙語

发布时间:2026-02-08 14:35:13

|

892人浏览过

|

来源于php中文网

原创

如何根据分组列的最后一个值对 DataFrame 进行二次分组

本文介绍如何先按某一列(如 'y')分组,再基于每组中指定列(如 'x')的最后一个值进行聚合分组,从而实现动态、无需预知分组键的嵌套式分组逻辑。

在 Pandas 数据分析中,有时需要按“组内某个特征的最终状态”进行再分组——例如:按用户会话(y)分组后,进一步将所有以相同操作(x 的最后一行值)结尾的会话归为一类。这种需求无法通过单层 groupby('y') 直接满足,而需构造一个基于组内末行值的新分组键

以下以原始数据为例:

import pandas as pd

df = pd.DataFrame({
    'x': ['a', 'b', 'c', 'c', 'e', 'f', 'd', 'a', 'b', 'c', 'c', 'e', 'f', 'd'],
    'y': ['a', 'a', 'a', 'a', 'b', 'b', 'b', 'f', 'f', 'f', 'f', 'g', 'g', 'g'],
})

目标是:

  • 先按 'y' 分组(共 4 组:y='a', 'b', 'f', 'g');
  • 提取每组中 'x' 列的最后一个值(即 y='a' 组末行为 'c',y='b' 组末行为 'd',依此类推);
  • 再按这些“组末 x 值”(如 'c', 'd')统一聚类,得到两个大组。

✅ 推荐方案:使用 groupby().transform('last')

最清晰、可读性强且健壮的方式是借助 transform('last') 构造辅助列:

# 步骤1:按 'y' 分组,提取每组 'x' 的最后一个值,广播到该组所有行
last_x_per_y = df.groupby('y')['x'].transform('last')

# 步骤2:按此新列再次分组
for last_val, group in df.groupby(last_x_per_y):
    print(f"\nGroup where last 'x' in 'y'-group is: '{last_val}'")
    print(group)

输出:

Manus
Manus

全球首款通用型AI Agent,可以将你的想法转化为行动。

下载
Group where last 'x' in 'y'-group is: 'c'
    x  y
0   a  a
1   b  a
2   c  a
3   c  a
7   a  f
8   b  f
9   c  f
10  c  f

Group where last 'x' in 'y'-group is: 'd'
    x  y
4   e  b
5   f  b
6   d  b
11  e  g
12  f  g
13  d  g
? transform('last') 保证了结果长度与原 DataFrame 一致,且自动对齐——这是实现“组内特征广播”的关键。

⚡ 高性能替代方案(适用于 y 值唯一连续成块)

若 'y' 列天然构成不重叠、连续的逻辑块(如日志中按会话 ID 有序排列),可跳过 groupby,用向量化操作提速:

# 方案A:利用 drop_duplicates + map(推荐,语义清晰)
mapper = df.drop_duplicates('y', keep='last').set_index('y')['x']
last_x = df['y'].map(mapper)

# 方案B:用 mask + bfill(更紧凑,但可读性略低)
last_x = df['x'].mask(df['y'].duplicated(keep='last')).bfill()

# 后续分组不变
for k, grp in df.groupby(last_x):
    print(f"\nGroup for last x = '{k}':")
    print(grp)

? 通用化:支持任意组内聚合逻辑

若需基于其他规则(如首值、众数、自定义函数)生成分组键,只需替换 transform 中的参数:

# 例如:用每组 'x' 的第一个值分组
last_x = df.groupby('y')['x'].transform('first')

# 或用自定义逻辑(如倒数第二行,需确保长度≥2)
last_x = df.groupby('y')['x'].transform(lambda s: s.iloc[-2] if len(s) >= 2 else s.iloc[0])

? 输出为字典便于后续处理

如需将结果存为字典(键为分组值,值为子 DataFrame),一行即可:

grouped_dict = dict(list(df.groupby(last_x_per_y)))
# grouped_dict['c'] → 包含所有以 'c' 结尾的 y-group 的行

⚠️ 注意事项

  • y 是否真正独立? 若 'y' 值重复出现但语义不同(如 ['a','a','b','b','a','a'] 应视为 3 个独立会话而非 2 个),需改用序列分组:
    y_group_id = df['y'].ne(df['y'].shift()).cumsum()  # 生成连续块ID
    last_x = df.groupby(y_group_id)['x'].transform('last')
  • 空组/单行组安全:transform('last') 对单行组天然安全;若用 iloc[-1] 自定义函数,建议加长度判断。
  • 性能提示:transform('last') 在底层高度优化,通常优于 apply(lambda x: x.iloc[-1])。

掌握这一技巧,即可灵活实现“以组态终值为锚点”的多级分组,在用户行为分析、时序会话聚类、状态机日志归并等场景中极具实用价值。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

73

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

3

2026.01.31

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

211

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

191

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

58

2026.01.05

数据分析的方法
数据分析的方法

数据分析的方法有:对比分析法,分组分析法,预测分析法,漏斗分析法,AB测试分析法,象限分析法,公式拆解法,可行域分析法,二八分析法,假设性分析法。php中文网为大家带来了数据分析的相关知识、以及相关文章等内容。

481

2023.07.04

数据分析方法有哪几种
数据分析方法有哪几种

数据分析方法有:1、描述性统计分析;2、探索性数据分析;3、假设检验;4、回归分析;5、聚类分析。本专题为大家提供数据分析方法的相关的文章、下载、课程内容,供大家免费下载体验。

285

2023.08.07

网站建设功能有哪些
网站建设功能有哪些

网站建设功能包括信息发布、内容管理、用户管理、搜索引擎优化、网站安全、数据分析、网站推广、响应式设计、社交媒体整合和电子商务等功能。这些功能可以帮助网站管理员创建一个具有吸引力、可用性和商业价值的网站,实现网站的目标。

747

2023.10.16

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

67

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java 教程
Java 教程

共578课时 | 59.9万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号