0

0

Pandas DataFrame 分组聚合与自定义顺序字符串合并教程

霞舞

霞舞

发布时间:2025-07-17 14:34:01

|

1017人浏览过

|

来源于php中文网

原创

Pandas DataFrame 分组聚合与自定义顺序字符串合并教程

本教程详细介绍了如何在 Pandas DataFrame 中实现复杂的数据聚合操作。我们将学习如何根据指定列进行分组,提取并合并各组内另一列的唯一字符串成员,并在此基础上,按照预定义的特定顺序对合并后的字符串进行排序。教程提供了两种实现方法:一种是利用 lambda 表达式结合映射字典进行自定义排序,另一种是封装为自定义函数并结合 itertools.chain 进行更高效的处理,旨在帮助读者掌握 Pandas 高级数据处理技巧。

在数据分析和处理过程中,我们经常会遇到需要对字符串数据进行聚合和整理的场景。例如,在处理包含多值属性的列时,可能需要将这些属性合并成一个单一的字符串,并且要求合并后的子字符串遵循特定的顺序。本教程将以一个具体的示例来演示如何使用 pandas 实现这一目标。

问题描述

假设我们有一个 DataFrame,其中包含 CLASS 和 MEMBERS 两列。MEMBERS 列可能包含由 " & " 分隔的多个成员字符串。我们的目标是:

  1. 按 CLASS 列进行分组。
  2. 在每个组内,收集 MEMBERS 列中所有的唯一成员。
  3. 将这些唯一的成员重新组合成一个由 " & " 分隔的字符串。
  4. 最重要的是,合并后的成员字符串必须按照预定义的顺序排列,例如 ['foo', 'bar', 'baz', 'luz']。

以下是初始 DataFrame 示例:

import pandas as pd

df = pd.DataFrame({'CLASS': ['A', 'B', 'A'],
                   'MEMBERS': ['foo & bar', 'bar & luz', 'baz']})

print(df)
#   CLASS    MEMBERS
# 0     A  foo & bar
# 1     B  bar & luz
# 2     A        baz

我们期望的输出结果是:

# CLASS
# A    foo & bar & baz
# B          bar & luz
# Name: MEMBERS, dtype: object

可以看到,对于 CLASS A,原始成员是 ['foo & bar', 'baz']。去重后得到 ['foo', 'bar', 'baz']。按照指定顺序 ['foo', 'bar', 'baz', 'luz'] 排序后,得到 foo & bar & baz。

解决方案

为了实现上述目标,我们需要结合 Pandas 的 groupby 和 agg 方法,并利用 Python 的字符串处理、集合操作以及自定义排序逻辑。

Boba.video
Boba.video

AI动漫视频生成器

下载

方法一:使用 lambda 表达式结合映射字典进行自定义排序

这种方法直接在 agg 函数中使用 lambda 表达式,通过构建一个映射字典来为 sorted 函数提供自定义排序键。

  1. 定义排序顺序和映射字典: 首先,我们需要定义期望的成员排序顺序。然后,创建一个字典 mapper,将每个成员字符串映射到其在排序列表中的索引。这个字典将作为 sorted 函数的 key 参数,用于指定排序依据。

    order = ['foo', 'bar', 'baz', 'luz']
    mapper = {k: i for i, k in enumerate(order)}
    # mapper 的结果将是:{'foo': 0, 'bar': 1, 'baz': 2, 'luz': 3}
  2. 应用 groupby 和 agg: 接下来,对 DataFrame 进行分组,并对 MEMBERS 列应用聚合函数。聚合函数内部的逻辑如下:

    • ' & '.join(s).split(' & '):将当前组内所有 MEMBERS 列的字符串连接成一个大字符串,然后根据 " & " 分隔符拆分成一个成员列表。
    • set(...):将上述成员列表转换为集合,以自动去除重复的成员。
    • sorted(..., key=mapper.get):对去重后的成员集合进行排序。这里的关键是 key=mapper.get。mapper.get(item) 会返回 item 在 order 列表中的索引。如果 item 不在 mapper 中(即不在 order 列表中),mapper.get 默认返回 None,sorted 会将 None 视为最小或最大值(取决于 Python 版本和数据类型,通常会排在前面或后面),这需要在使用时注意。
    • " & ".join(...):将排序后的成员列表重新连接成一个字符串。
    out = (df.groupby('CLASS')['MEMBERS']
             .agg(lambda s: " & ".join(sorted(set(' & '.join(s).split(' & ')),
                                              key=mapper.get)))
          )
    
    print(out)
    # CLASS
    # A    foo & bar & baz
    # B          bar & luz
    # Name: MEMBERS, dtype: object

方法二:封装为自定义函数并利用 itertools.chain

当聚合逻辑变得复杂时,将其封装到一个独立的函数中会使代码更清晰、更易于维护。此外,itertools.chain.from_iterable 可以更高效地扁平化列表的列表。

  1. 导入 itertools:

    from itertools import chain
  2. 定义自定义聚合函数: 创建一个名为 cust_join 的函数,它接受 Series s(当前组的 MEMBERS 列)和 order 列表作为参数。

    def cust_join(s, order):
        mapper = {k: i for i, k in enumerate(order)}
        # 使用 chain.from_iterable 扁平化所有成员列表
        # s 是一个 Series,其每个元素都是一个字符串,如 'foo & bar'
        # x.split(' & ') 将每个字符串拆分成列表,如 ['foo', 'bar']
        # chain.from_iterable 负责将 ['foo', 'bar'], ['baz'] 这样的列表的列表扁平化为 ['foo', 'bar', 'baz']
        all_members = set(chain.from_iterable(x.split(' & ') for x in s))
    
        # 按照 mapper 的值进行排序
        sorted_members = sorted(all_members, key=mapper.get)
    
        return ' & '.join(sorted_members)
  3. 应用 groupby 和自定义函数: 在 agg 方法中直接调用 cust_join 函数,并通过 order 参数传递排序列表。

    out_alt = (df.groupby('CLASS')['MEMBERS']
                 .agg(cust_join, order=['foo', 'bar', 'baz', 'luz'])
              )
    
    print(out_alt)
    # CLASS
    # A    foo & bar & baz
    # B          bar & luz
    # Name: MEMBERS, dtype: object

这种方法将聚合逻辑封装起来,使得 agg 调用更加简洁,并且 itertools.chain.from_iterable 在处理大量子列表时通常比 join().split() 更加高效。

注意事项

  • 排序顺序的完整性: 确保 order 列表中包含了所有可能出现在 MEMBERS 列中的子字符串。如果 MEMBERS 中存在 order 列表之外的字符串,mapper.get 会返回 None。sorted 函数在处理 None 值时,通常会将其排在非 None 值之前或之后(取决于 Python 版本和具体实现),这可能导致非预期的排序结果。如果需要精确控制,可以考虑在 mapper 中为未定义的成员分配一个较大的默认索引值,或者在 sorted 之前过滤掉这些成员。
  • 性能考量: 对于非常大的数据集,字符串的 split 和 join 操作可能会比较耗时。itertools.chain.from_iterable 在一定程度上可以优化扁平化过程,但核心的字符串操作仍是性能瓶颈。在极端情况下,可能需要考虑使用更底层的数据结构或优化算法。
  • 分隔符的一致性: 确保 MEMBERS 列中的分隔符与代码中使用的分隔符(" & ")保持一致。不一致的分隔符会导致成员提取错误。

总结

本教程展示了如何在 Pandas 中实现对字符串列的复杂聚合和自定义排序。通过结合 groupby、agg、Python 的集合操作以及 sorted 函数的 key 参数,我们可以灵活地控制聚合结果的结构和顺序。无论是使用 lambda 表达式直接实现,还是封装为自定义函数并利用 itertools.chain 提升代码可读性和潜在性能,掌握这些技巧都将大大增强您在 Pandas 中处理复杂字符串数据的能力。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

78

2025.12.04

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

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

12

2026.01.31

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

335

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

223

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

138

2026.02.12

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

738

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

219

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1561

2023.10.24

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

23

2026.03.06

热门下载

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

精品课程

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

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.8万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.8万人学习

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

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