跳至主要内容

掌握 Pandas .explode() 方法:完整指南

全面了解 pandas .explode() 方法,涵盖单列与多列、处理嵌套数据以及常见陷阱,并配有实用的 Python 代码示例。
· 5分钟 阅读

使用 AI 探索

在使用 pandas 进行数据处理时,.explode() 方法在处理 DataFrame 中的列表时常常非常实用。本教程将作为您掌握 .explode() 方法的手册,从基础机制到高级用法及常见陷阱,逐一讲解。

简要答案:.explode() 的工作原理

如果您只想快速了解,请阅读本节。.explode() 方法用于将列表型列中的条目按多个行展开,使列表中的每个元素成为单独的一行。举例来说,我们将使用下方的 DataFrame df 来演示该过程:

ID

Interests

1

['Python', 'Data Science']

2

['Machine Learning', 'AI']

.explode() 方法会将 Interests 列的元素展开,如下所示:

# Explode the Interests column 
exploded_df = df.explode('Interests')

ID

Interests

1

Python

1

Data Science

2

Machine Learning

2

AI

什么是 Pandas 的 .explode() 方法?

.explode() 方法旨在简化对嵌套数据(如 列表 或 元组)的处理。通过将列表状结构中的每个元素转换为单独一行,.explode() 提升了数据的可访问性与可分析性。

.explode() 方法如何工作?

.explode() 的功能既强大又直观,旨在提升数据处理任务的易用性与效率。

  • Column:指定要展开的、包含列表型条目的列。
  • ignore_index:当设为 True 时,会将索引重置为默认的整数索引,有助于在展开后保持 DataFrame 的完整性。默认值为 False。

使用 Pandas .explode() 的两种方式

在 Pandas 中展开单列

最常见的用法是展开单个列,将其中每个列表型条目扩展为独立的行。在简要答案一节我们已经演示过,下面再来回顾该示例。这里有一个 DataFrame df,包含个人的 ID 及其学习兴趣。可以看到,学习兴趣以列表形式存储。

ID

Interests

1

['Python', 'Data Science']

2

['Machine Learning', 'AI']

.explode() 方法会将 Interests 列的元素展开为独立行,如下所示:

# Explode the Interests column 
exploded_df = df.explode('Interests')

ID

Interests

1

Python

1

Data Science

2

Machine Learning

2

AI

该方法对包含分类数据或每条观测具有多个属性的列尤为有用。

在 Pandas 中展开多列

您也可能需要在一个 DataFrame 中同时展开多列。这在多个列包含需同时解包的列表型结构时非常有用。我们为 df 添加一个 Tools 列来演示:

ID

Interests

Tools

1

['Python', 'Data Science']

['Pandas', 'NumPy']

2

['Machine Learning', 'AI']

['Scikit-learn', 'TensorFlow']

要展开多列,只需将要展开的列以列表形式传入即可

# Explode the Interests & Tools columns
exploded_df = df.explode(['Interests', 'Tools'])

ID

Interests

Tools

1

Python

Pandas

1

Data Science

NumPy

2

Machine Learning

Scikit-learn

2

AI

TensorFlow

该方法在处理包含列表的多列时尤为实用。不过,使用 .explode() 时也可能遇到一些陷阱,下一节将进行说明。

使用 Pandas .explode() 的常见错误与解决方案

重复列被展开

使用 .explode() 时,一个常见陷阱是误将重复的列名一并展开。请务必确保传入的列名列表中不含重复项!

# Incorrect, exploding duplicate columns
df.explode(['Interests','Tools','Interests'])

# Correct, exploding unique columns
df.explode(['Interests','Tools'])

展开看起来像列表的字符串

很多时候,DataFrame 中的某些行是字符串,但它们看起来像列表。尝试对形如 "['Python', 'AI']" 的字符串进行展开不会产生变化,因为 .explode() 期望的是实际的列表型对象,而不是看起来像列表的字符串。下面给出可能的情形及其解决方案。假设 df 的取值如下:

ID

Interests

1

"['Python', 'Data Science']"

2

"['Machine Learning', 'AI']"

可以看到,Interests 列的值是看起来像列表的字符串。对 Interests 使用 .explode() 不会有任何变化,因为这些值只是单个字符串。为了解决该问题,我们将 Interests 的值转换为列表。

import ast

df['Interests'] = df['Interests'].apply(ast.literal_eval)
exploded_df = df.explode('Interests')
print(exploded_df) # This will work

多列中列表长度不一致

在处理 pandas DataFrame 时,常见陷阱之一是:要展开的多列中,某些行的列表长度不一致。这会导致对多列使用 .explode() 后,数据错位或不完整。举例来说,假设 df 如下:

ID

Interests

Tools

1

['Python', 'Data Science']

['Pandas']

2

['Machine Learning']

['Scikit-learn', 'TensorFlow']

如上所示,Interests 与 Tools 列中的列表长度不同。直接对这些列使用 .explode() 会报错,因为各列的列表长度必须一致。要解决该问题,可使用自定义函数用 None 进行填充,如下:

​​# Function to pad lists to the same length
def pad_lists(row):
    max_len = max(len(row['Interests']), len(row['Tools']))
    row['Interests'] += [None] * (max_len - len(row['Interests']))
    row['Tools'] += [None] * (max_len - len(row['Tools']))
    return row

# Apply the padding function to each row
df = df.apply(pad_lists, axis=1)

# Now, safely explode both columns
df.explode(['Interests','Tools'])

ID

Interests

Tools

1

Python

Pandas

1

Data Science

None

2

Machine Learning

Scikit-learn

2

None

TensorFlow

结语

总之,.explode() 方法在将值列表解包为 Pandas DataFrame 的多行时非常有用。若想进一步学习 pandas,请参考以下资源:

Adel Nehme

作者

Adel Nehme

Adel 是一位数据科学教育者、演讲者,以及 DataCamp 的媒体副总裁。他推出了多门关于数据分析、机器学习和数据工程的课程与直播培训,热衷于在组织内推广数据技能与数据素养,并关注技术与社会的交汇。他拥有数据科学与商业分析硕士学位。闲暇时,您常能发现他陪他的猫 Louis 一起玩耍。

主题