0

0

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

聖光之護

聖光之護

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

|

789人浏览过

|

来源于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)

输出结果完全匹配预期:

AimiAD
AimiAD

通过 AimiAD 让您的 AI 应用开始赚钱

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

更多
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

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

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

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

67

2026.02.06

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Rust 教程
Rust 教程

共28课时 | 5.6万人学习

Git 教程
Git 教程

共21课时 | 3.4万人学习

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

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