Python Pandas DataFrame explode()方法

2025年3月13日 | 阅读 4 分钟

引言

在使用 Pandas 分析表格数据时,很可能会遇到某一列包含列表或其他可迭代结构(如数组)的情况。处理这类列总是有些挑战,但 Pandas 提供了一个名为 `explode()` 的辅助方法。

在本文中,我将详细介绍 Pandas 的 `explode()` 方法。

目录

  • 什么是 `explode()` 方法?
  • 何时应该使用 `explode()`?
  • 如何使用 Pandas `explode()`
  • 使用 `explode()` 处理缺失数据
  • `explode()` 的优缺点
  • 结论

什么是 `explode()` 方法?

Pandas Python 库中的 DataFrame 有许多特性,其中 `explode()` 方法用于将列表类列中的每个元素拆分成单独的行,并保留子元素。当 DataFrame 的某一列中的每行都包含一个列表、元组或数组,而您希望将列表元素转换成新行时,它尤其有用。

本质上,它将一个类列表的列“炸开”(explode)成多行,并相应地复制其他列的值。

语法

  • `column`: 要炸开的列。
  • `ignore_index`: 默认值为 'True' 时,炸开后的 DataFrame 的索引将被重置。默认设置为 'False'。

何时应该使用 `explode()`?

当您的 DataFrame 包含一个或多个包含数组或列表的列,并且您想将这些列表拆分成不同的行时,应该使用它。

例如,如果您处理的是客户交易数据,并且每个客户有多笔交易存储在一个列的列表中,您可以展开(unnest)该列,使每笔交易都成为一个可供评估的行。

如何使用 Pandas `explode()`?

让我们从一个在一个列中包含列表的简单 DataFrame 开始。

示例

输出

 
      Name   Hobbies
0  Shruthi   Reading
0  Shruthi   Cycling
1  Shreeya    Gaming
1  Shreeya   Drawing
2    Shiva  Swimming
2    Shiva    Hiking

请注意,`Hobbies` 列最初包含列表,现在已拆分到多个行中。`Name` 列为每个爱好重复自身。

说明

  • 创建 DataFrame
    • 我们创建一个包含 `Name` 和 `Hobbies` 两列的表格(DataFrame)。
    • `Hobbies` 列为每个人包含列表(例如,Alice 有两个爱好:“阅读”和“骑行”)。
  • 应用 `explode()`
    • 在 `Hobbies` 列上使用 `explode()` 方法。这将获取 `Hobbies` 列表中每个项目,并将其放入自己的行中。
    • Name 列中的姓名会为每个对应的爱好重复。
  • 结果
    • 现在,每个爱好都有自己的行,而不是列表,并且在 Name 列中,每个人的条目有多个。
    • 这使得数据更容易处理。

使用 `explode()` 处理缺失数据

如果您的列包含 `NaN` 或 `None` 值,`explode()` 会将它们原样保留。

示例

输出

 
      Name  Hobbies
0  Shruthi  Reading
0  Shruthi  Cycling
1    Shiva   Gaming
1    Shiva     None
2  Shreeya     None 

在这种情况下,`None` 值在炸开过程中不受影响。

说明

  • 创建包含缺失数据的 DataFrame
    • 此表格(DataFrame)与上一个类似,但包含一些缺失值(`None`)。
    • 对于 Bob,其中一个爱好是 `None`(他只有一个有效爱好),而对于 Charlie,整个 `Hobbies` 条目是缺失的(`None`)。
  • 应用 `explode()`
    • 再次在 `Hobbies` 列上使用 `explode()` 方法。
    • 缺失值(`None`)保持不变。如果一行有一个 `None` 值而不是列表,它在炸开后将保持 `None`。
  • 结果
    • 对于 Shruthi 和 Shiva,他们的爱好像之前一样被炸开了。
    • Shiva 的第二个爱好是 `None`,这在输出中得到了保留。
    • Shreeya 的整个 `Hobbies` 行保持为 `None`,因为没有列表可供炸开。

`explode()` 的优点

  • 轻松拆分类列表数据:将 DataFrame 列中的列表、数组或元组转换为单独的行。
  • 简化分析:将复杂、嵌套的数据结构分解为更简单的行,以便于操作。
  • 处理缺失数据:即使列包含 `NaN` 或 `None` 值也能正常工作。
  • 保持数据对齐:其他列会自动为每炸开的行重复其值。

`explode()` 的缺点

  • 数据量增加:炸开大型列表会显著扩展 DataFrame,增加内存使用量。
  • 性能影响:在大型数据集上,该方法可能速度较慢或资源消耗较大。
  • 仅限单列操作:一次只能炸开一列,当需要对多列进行类似处理时,会限制其用途。
  • 需要 Pandas 1.3+:旧版 Pandas 不支持同时炸开多列。

结论

Pandas 的 `explode()` 方法是转换 DataFrame 最有用的工具之一,尤其是在处理包含值列表或数组的列时。它有助于将类列表结构(数据以行形式存在)转换为长格式 DataFrame 以进行分析。

无论您是处理客户交易、博客文章标签还是任何其他多值字段,`explode()` 方法都可以使您的数据分析更加直观和有效。

明智地使用它,在处理大型数据集时注意性能,并妥善处理缺失值,以确保最佳结果。