【遇见Pandas】将使用空格区分的字符串拆分为单独行(explode方法详解)

319 阅读2分钟

问题

DataFrame结构如下:

image.png

需求:将买入股票代码,拆分到单独的行中

image.png

代码

import pandas as pd

# 创建一个含有"交易日期"和"买入股票代码"两列的数据框
df = pd.DataFrame({
    "交易日期": ["2017-01-12"],
    "买入股票代码": ["sh603323 sz002265"]
})

# 分割 "买入股票代码" 列
df[['买入股票代码']] = df['买入股票代码'].str.split(" ")

# 用 explode 方法拆分 "买入股票代码" 列
df = df.explode("买入股票代码")

# 因为每个股票代码后面,都跟上了空格,所以会产生空行
# 我们在这里,过滤掉空行
df = df[df['买入股票代码'].str.len() > 0]

# 输出结果
print(df)

解析

explode,爆炸,很形象说明了这个函数所想要做的事情 —— 把一行内容,炸出很多行。 其特点为,除爆破的内容外,其他行保持不变(包括索引) explode可以作用在Series、DataFrame上

作用于Series

直接调用即可:s.explode()

# 原始数据
s = pd.Series([[1, 2, 3], 'foo', [], [3, 4]])
s
'''
0 [1, 2, 3]
1 foo
2 []
3 [3, 4]
dtype: object
'''
# 爆炸列
s.explode()
'''
0 1
0 2
0 3
1 foo
2 NaN
3 3
3 4
dtype: object
'''

作用于DataFrame

需要显式指定爆炸列df.explode('列')

参数

  • column: IndexLabel

需要分裂的列。如果是多列,需要提供一个非空的列表,每个元素是字符串或元组,并且所有指定的列的列表数据,必须在DataFrame的同一行上,长度必须相同。

  • ignore_index: bool,默认为False

默认爆炸后的index保持原样。如果为True,则生成的index将被标记为0,1,…,n-1。

可能的报错

  • DataFrame的列不唯一
  • 指定要爆炸的列,为空

相关方法

  • DataFrame.unstack:把df的index列降级拍平
  • DataFrame.melt:数据融合函数 image.png
# 原始数据
df = pd.DataFrame({'A': [[1, 2, 3], 'foo', [], [3, 4]], 'B': range(4)})
df
'''
A B
0 [1, 2, 3] 0
1 foo 1
2 [] 2
3 [3, 4] 3
'''
# 爆炸指定列
df.explode('A')
'''
A B
0 1 0
0 2 0
0 3 0
1 foo 1
2 NaN 2
3 3 3
3 4 3
'''

小结

数据处理中,经常需要将多行数据合并到一行,然后再将一行数据展平为多行。此时,explode函数就非常非常关键了。这是一个Pandas进阶

参考文献

《深入浅出Pandas:利用Python进行数据处理与分析》

《Pandas文档》

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 6 天,点击查看活动详情