讲师中心 微信公众号
AI工具推荐 视频效率加速

如何基于分组列与各组末行值进行双重分组

落涛酱_3272

落涛酱_3272

发布时间:2026-02-08 16:27:45

|

829人浏览过

|

来源于php中文网

原创

如何基于分组列与各组末行值进行双重分组

本文介绍在 pandas 中实现“先按某一列(如 `y`)分组,再依据每组中指定列(如 `x`)的最后一个值作为新分组键”的高效方法,适用于未知末行值场景,避免硬编码过滤。

在数据分析中,常需对 DataFrame 进行嵌套式逻辑分组:例如,先按业务维度(如 'y' 列)划分自然组,再根据每组内某关键字段(如 'x')的最终状态(即最后一行的值)进行二次聚合或拆分。该需求不同于普通 groupby,核心难点在于:末行值未知且需动态提取,无法预先枚举。

以下以实际数据为例,展示专业、可扩展的解决方案:

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']
})

目标是将 df 按 'y' 分组后,提取每组 'x' 的最后一个值(即该组“终态”),再以此终态值为键重新分组——最终得到两组:终态为 'c' 的组(含 y='a' 和 y='f')、终态为 'd' 的组(含 y='b' 和 y='g')。

✅ 推荐方案:transform('last') 构建动态分组键

最清晰、可读性最强的方式是使用 groupby().transform('last') 提取每组 'x' 的末值,并生成与原 DataFrame 等长的分组映射序列:

# 步骤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"\n【终态为 '{last_val}' 的组】")
    print(group)

输出结果完全匹配预期:

应用程序在线商店宣传网站模板
应用程序在线商店宣传网站模板

应用程序在线商店宣传网站模板是一款提供免费应用程序在线商店宣传网站模板下载。提示:本模板调用到谷歌字体库,可能会出现页面打开比较缓慢。

下载
【终态为 '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

【终态为 'd' 的组】
    x  y
4   e  b
5   f  b
6   d  b
11  e  g
12  f  g
13  d  g
? 原理说明:transform('last') 会为每个 'y' 组计算 'x' 的末值(如 y='a' 组末行为 'c'),并将该值填充到该组所有行对应位置,从而生成长度为 len(df) 的 Series last_x_per_y,可直接用于 groupby()。

⚡ 高性能替代方案(适合大数据)

若 'y' 列天然构成连续唯一块(即相同 'y' 值总是相邻出现),可绕过 groupby,用向量化操作加速:

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

# 方案B:利用 duplicated + bfill(内存友好)
last_x_fast = df['x'].mask(df['y'].duplicated(keep='last')).bfill()

# 后续分组逻辑一致
for k, g in df.groupby(last_x_fast):
    print(f"\nGroup by last x = '{k}':\n{g}")

? 通用化:支持任意行选择逻辑

若需取“倒数第二行”、“最大值对应行”等非固定位置,可将 transform 与 lambda 结合:

# 取每组 'x' 的倒数第二行(需确保组长度 ≥ 2)
last_x_custom = df.groupby('y')['x'].transform(lambda s: s.iloc[-2] if len(s) >= 2 else s.iloc[0])

# 或取每组 'x' 中字典序最大值
last_x_max = df.groupby('y')['x'].transform('max')

? 输出结构化结果

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

grouped_dict = dict(list(df.groupby(last_x_per_y)))
# grouped_dict['c'] → 包含所有终态为 'c' 的行
# grouped_dict['d'] → 包含所有终态为 'd' 的行

⚠️ 注意事项

  • y 列连续性假设:文中 drop_duplicates(..., keep='last') 方案要求 'y' 相同值在原始数据中物理连续;若 'y' 呈离散分布(如 ['a','b','a','b'] 应视为4个独立组),请改用 df.groupby(df['y'].ne(df['y'].shift()).cumsum()) 构建自然段落组。
  • 空组处理:transform 在空组上返回 NaN,建议提前检查 df['y'].nunique() 是否为 0。
  • 性能对比:transform('last') 在中等数据量下简洁可靠;超大数据(千万级+)优先选用 map + drop_duplicates 方案,减少分组开销。

掌握这一模式,即可灵活应对“按维度分组 → 提取组内特征 → 依特征再分组”的典型分析链路,大幅提升 Pandas 流水线表达力与鲁棒性。

热门AI工具

更多
码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

相关专题

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

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

340

2025.12.04

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

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

272

2026.01.31

Python数据分析与Pandas高级实战
Python数据分析与Pandas高级实战

本专题围绕 Python 数据分析展开,系统讲解 Pandas 的高级用法,包括数据清洗、透视表、时间序列分析以及多表合并与分组操作。通过实战案例,帮助开发者掌握高效处理与分析数据的方法,提高数据处理效率与分析能力。

771

2026.04.13

lambda表达式
lambda表达式

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

1091

2023.09.15

python lambda函数
python lambda函数

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

345

2025.11.08

Python lambda详解
Python lambda详解

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

614

2026.01.05

C++ Lambda 表达式与函数式编程
C++ Lambda 表达式与函数式编程

深入讲解 C++ Lambda 表达式与函数式编程范式,涵盖 Lambda 基础语法与返回值推导、值捕获与引用捕获的区别与陷阱、初始化捕获(C++14 广义捕获)、泛型 Lambda(auto 参数)、mutable 关键字修改捕获变量、std::function 类型擦除与函数包装、std::bind 参数绑定(及其被 Lambda 替代的趋势)、Lambda 在 STL 算法(sort/transform/for_each/remo

789

2026.05.06

Java 函数式接口与 Lambda 进阶技巧
Java 函数式接口与 Lambda 进阶技巧

在 Java Stream 基础之上进一步深入函数式编程,涵盖 @FunctionalInterface 注解与自定义函数式接口设计、四种方法引用(静态/实例/对象/构造器)的使用场景、Lambda 中的 effectively final 变量捕获规则、函数组合(andThen/compose)与柯里化技巧、Comparator 链式比较器构建、CompletableFuture 异步函数式编排、Reactor / RxJava 响应

428

2026.05.08

Tailwind CSS 如何制作导航栏和卡片
Tailwind CSS 如何制作导航栏和卡片

用 Tailwind CSS 制作导航栏和卡片,可先搭建语义化结构,再组合 Flex、Grid、间距、圆角与阴影类。这里整理横向导航、移动端菜单、卡片网格及悬停效果的相关文章,帮助你把常见页面组件做得清晰且适配不同屏幕。

0

2026.11.03

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
LLVM Programmer’s Manual
LLVM Programmer’s Manual

共0课时 | 0人学习

Conan 包创建教程
Conan 包创建教程

共0课时 | 0人学习

Visual Studio 入门指南
Visual Studio 入门指南

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn