展开菜单
首页 精品内容 本月促销 装机必备 Windows macOS软件 IOS软件 Android AI PDF教程 专题
全部分类

当前位置:

首页 > 编程开发 > Pandas MultiIndex分组聚合教程详解

Pandas MultiIndex分组聚合教程详解

本教程旨在解决PandasMultiIndexDataFrame在不同索引级别上应用不同分组聚合规则的挑战。我们将演示如何通过重置索引、对特定级别进行字符串转换,然后执行多列分组聚合来达到自定义的数据汇总效果,从而实现对复杂数据结构的灵活处理。

Pandas MultiIndex DataFrame 多级自定义分组聚合教程

本教程旨在解决Pandas MultiIndex DataFrame在不同索引级别上应用不同分组聚合规则的挑战。我们将演示如何通过重置索引、对特定级别进行字符串转换,然后执行多列分组聚合来达到自定义的数据汇总效果,从而实现对复杂数据结构的灵活处理。

1. 引言与问题背景

在数据分析中,Pandas DataFrame 及其 MultiIndex(多级索引)功能为处理复杂层次结构数据提供了强大的工具。然而,当我们需要对 MultiIndex DataFrame 的不同级别应用不同的分组和聚合逻辑时,传统的 groupby(level=...) 方法可能无法直接满足所有需求,特别是当某个级别的分组键需要进行自定义转换时。

本教程将通过一个具体案例,详细讲解如何实现这样的复杂多级分组聚合。

2. 初始数据结构

假设我们有一个 MultiIndex DataFrame,其索引包含两级:first 和 second。first 级别包含 'bar', 'baz', 'foo', 'qux' 等,second 级别包含 'one1', 'one2', 'two' 等。DataFrame 还包含两列数据 'A' 和 'B'。

首先,我们创建这个示例 DataFrame:

import pandas as pd
import numpy as np

# 定义 MultiIndex 的数组
arrays = [
    ["bar", "bar", "baz", "baz", "foo", "foo", "qux", "qux"],
    ["one1", "one2", "one1", "one2", "one1", "two", "one1", "two"],
]

# 从数组创建 MultiIndex,并指定索引名称
index = pd.MultiIndex.from_arrays(arrays, names=["first", "second"])

# 创建 DataFrame
df = pd.DataFrame({"A": [1, 1, 1, 1, 2, 2, 3, 3], "B": np.arange(8)}, index=index)

print("原始 DataFrame:")
print(df)

输出的原始 DataFrame 如下:

原始 DataFrame:
              A  B
first second      
bar   one1     1  0
      one2     1  1
baz   one1     1  2
      one2     1  3
foo   one1     2  4
      two     2  5
qux   one1     3  6
      two     3  7

3. 目标分组聚合逻辑

我们的目标是实现一种特殊的聚合:

  • 对于第一级索引 (first):保持其原有的分组逻辑,即按 'first' 级别进行聚合。
  • 对于第二级索引 (second):需要进行自定义转换。具体来说,我们希望将 second 级别的值截取前三个字符作为新的分组键。例如,'one1' 和 'one2' 都应归入 'one' 组。而 'two' 则保持 'two'。
  • 聚合操作:对 'A' 和 'B' 列进行求和 (sum) 聚合。

最终期望的结果 DataFrame 如下:

              A  B
first second      
bar   one      2  1
baz   one      2  5
foo   one      2  4
      two      2  5
qux   one      3  6
      two      3  7

可以看到,'bar' 下的 'one1' 和 'one2' 合并为 'one',并且 'A' 和 'B' 列的值进行了求和 (1+1=2, 0+1=1)。'baz' 下同理。'foo' 和 'qux' 下的 'one1' 也合并为 'one',而 'two' 保持不变。

4. 解决方案:重置索引与字符串转换

由于 groupby 函数本身在分组过程中无法直接修改索引值来创建新的分组键,我们需要采取一种间接但有效的方法:

  1. 重置索引 (reset_index()):将 MultiIndex 转换为普通的数据列,使得 first 和 second 成为 DataFrame 的常规列。
  2. 转换 second 列:对新生成的 second 列应用字符串切片操作,将其值转换为新的分组键。
  3. 重新分组聚合 (groupby().sum()):使用转换后的 second 列以及 first 列作为新的分组键进行聚合。

下面是详细的实现步骤:

步骤 1: 重置索引

使用 df.reset_index() 将 first 和 second 索引级别转换为 DataFrame 的常规列。

df_reset = df.reset_index()
print("\n重置索引后的 DataFrame:")
print(df_reset)

输出:

重置索引后的 DataFrame:
  first second  A  B
0   bar   one1  1  0
1   bar   one2  1  1
2   baz   one1  1  2
3   baz   one2  1  3
4   foo   one1  2  4
5   foo    two  2  5
6   qux   one1  3  6
7   qux    two  3  7

步骤 2: 转换 second 列

现在 second 已经是一个普通列,我们可以对其进行字符串操作。我们使用 .str[:3] 来截取每个字符串的前三个字符。

df_reset['second'] = df_reset['second'].str[:3]
print("\n转换 'second' 列后的 DataFrame:")
print(df_reset)

输出:

转换 'second' 列后的 DataFrame:
  first second  A  B
0   bar    one  1  0
1   bar    one  1  1
2   baz    one  1  2
3   baz    one  1  3
4   foo    one  2  4
5   foo    two  2  5
6   qux    one  3  6
7   qux    two  3  7

可以看到,'one1' 和 'one2' 都被成功转换为 'one'。

步骤 3: 重新分组并聚合

现在,DataFrame 已经准备好进行基于 first 和转换后的 second 列的分组。我们对 'A' 和 'B' 列执行求和聚合。

df_grouped = df_reset.groupby(['first', 'second'])[['A', 'B']].sum()
print("\n最终分组聚合结果:")
print(df_grouped)

输出:

最终分组聚合结果:
              A  B
first second      
bar   one      2  1
baz   one      2  5
foo   one      2  4
      two      2  5
qux   one      3  6
      two      3  7

这个结果与我们期望的目标完全一致。

5. 完整代码示例

将上述步骤整合到一起,得到完整的解决方案代码:

import pandas as pd
import numpy as np

# 1. 创建原始 MultiIndex DataFrame
arrays = [
    ["bar", "bar", "baz", "baz", "foo", "foo", "qux", "qux"],
    ["one1", "one2", "one1", "one2", "one1", "two", "one1", "two"],
]
index = pd.MultiIndex.from_arrays(arrays, names=["first", "second"])
df = pd.DataFrame({"A": [1, 1, 1, 1, 2, 2, 3, 3], "B": np.arange(8)}, index=index)

print("原始 DataFrame:")
print(df)

# 2. 重置索引,将 MultiIndex 级别转换为普通列
df_temp = df.reset_index()

# 3. 对 'second' 列进行自定义转换
# 将 'second' 列的值截取前三个字符作为新的分组键
df_temp['second'] = df_temp['second'].str[:3]

# 4. 根据 'first' 和转换后的 'second' 列进行分组,并对 'A', 'B' 列求和
result_df = df_temp.groupby(['first', 'second'])[['A', 'B']].sum()

print("\n最终分组聚合结果:")
print(result_df)

6. 注意事项与扩展

  • 数据类型:确保需要进行字符串操作的列是字符串类型。如果不是,可能需要先使用 .astype(str) 进行转换。
  • 性能考量:对于非常大的 DataFrame,reset_index() 会创建 DataFrame 的副本,这可能会消耗额外的内存。然而,对于大多数常见场景,这种方法是高效且易于理解的。
  • 其他聚合函数:除了 sum(),你还可以应用其他聚合函数,如 mean(), min(), max(), count() 等,或者使用 agg() 方法应用多个聚合函数。
  • 更复杂的转换:如果 second 列的转换逻辑更复杂(例如,基于正则表达式匹配或条件判断),你可以使用 apply() 方法配合自定义函数来处理该列。
  • 保持 MultiIndex:groupby() 操作默认会将分组键作为新的 MultiIndex。如果需要将它们作为普通列,可以在 groupby() 之后再调用 reset_index()。

7. 总结

本教程展示了如何在 Pandas MultiIndex DataFrame 上实现不同级别自定义分组聚合的策略。核心思想是将 MultiIndex 级别转换为普通列,对需要自定义分组逻辑的列进行预处理(如字符串截取),然后利用标准的 groupby() 方法进行聚合。这种方法提供了极大的灵活性,能够处理传统 groupby(level=...) 难以直接解决的复杂聚合需求。通过理解和掌握这种技术,你将能更有效地处理和分析多层次结构的数据。

本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
编程开发
相关文章 更多
精品专题 更多
本月促销

正软商城本月促销专区,汇集办公、设计、安全、影音、系统工具及AI软件等正版软件优惠活动,提供限时折扣、特价授权和优惠购买信息,活动库存及价格以页面实时展示为准。

装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

IOS软件

正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

AI

正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
灵活计算器
灵活计算器

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

图几
图几

图几是一款适用于 macOS 的截图、标注与美化工具,支持离线操作保障隐私。界面整理和高频系统操作被放到一起考虑,桌面或窗口内容一多时,管理起来会更省心。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Menuist
Menuist

Menuist 是一款面向 macOS 的 Finder 右键菜单增强工具,主要用来补充新建文件、快捷导航等常用操作,让日常文件管理和访问路径时更高效、更顺手。

Mole
Mole

Mole 是一款专为 Mac 设计的深度清理优化工具,涵盖缓存清理、应用管理及实时状态监控等功能。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

WINDOWS 更多
Windows 10
Windows 10

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

傲梅轻松备份
傲梅轻松备份

傲梅轻松备份是一款专业易用的数据备份软件,为重要数据提供安全保障。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

Wise Folder Hider Pro
Wise Folder Hider Pro

Wise Folder Hider Pro 是一款专业级文件和文件夹隐藏加密软件,为私密数据添加多重保护。高频操作更强调就近处理,浏览、整理和跨目录移动文件时,来回切换和重复点击都会少很多。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

PinStack
PinStack

PinStack是一款轻量级的Windows平台剪贴板管理工具,优化您的剪贴板使用体验。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Seer
Seer

Seer是一款在Win平台下的空格键功能增强效率工具,只需轻敲空格键,就能预览几乎任何格式的文件。它更适合把零散的小功能集中起来使用,处理高频琐碎任务时会更省事。