问题
DataFrame结构如下:
需求:将买入股票代码,拆分到单独的行中
代码
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:数据融合函数
# 原始数据
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 天,点击查看活动详情