【Pandas驯化-08】一文搞懂Dataframe中一行变多行explode、split中的expand用法
本次修炼方法请往下查看
🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地!
🎇 相关内容文档获取 微信公众号
🎇 相关内容视频讲解 B站
🎓 博主简介:AI算法驯化师,混迹多个大厂搜索、推荐、广告、数据分析、数据挖掘岗位 个人申请专利40+,熟练掌握机器、深度学习等各类应用算法原理和项目实战经验。
🔧 技术专长: 在机器学习、搜索、广告、推荐、CV、NLP、多模态、数据分析等算法相关领域有丰富的项目实战经验。已累计为求职、科研、学习等需求提供近千次有偿|无偿定制化服务,助力多位小伙伴在学习、求职、工作上少走弯路、提高效率,近一年好评率100% 。
📝 博客风采: 积极分享关于机器学习、深度学习、数据分析、NLP、PyTorch、Python、Linux、工作、项目总结相关的实用内容。
下滑查看解决方法
🎯 1. 基本介绍
在Pandas中,explode是一个用于将序列值分解成多行的函数。当DataFrame中的某一列包含序列(如列表或数组),而你希望将这些序列中的每个元素转换为DataFrame的一行时,explode就非常有用。
真实的数据分析工作中,通过用到explode是和str中的split结合起来用,因此,真实数据中,组成的list大多数为字符串格式,因此,通常需要将字符串转换成列表,然后在将使用explode函数将一列数据转换成多列数据。
💡 2. 使用方法
2.1 explode函数使用
为了要大家看起来更好的理解explode函数的使用,我们创建一个dataframe,然后将其一列为多个数组的列,转换成多个列。具体如下所示:
import pandas as pd
# 创建包含列表的 DataFrame
df = pd.DataFrame({
'ID': [1, 2],
'Values': [['A', 'B', 'C'], ['D', 'E', 'F']]
})
# 显示原始 DataFrame
print("原始 DataFrame:")
print(df)
原始 DataFrame:
ID Values
0 1 [A, B, C]
1 2 [D, E, F]
将使用explode将Values列中的每个元素转换为一行:
# 使用 explode 将 Values 列的元素转换为多行
df_exploded = df.explode('Values')
# 显示 explode 后的 DataFrame
print("\nexplode 后的 DataFrame:")
print(df_exploded)
explode 后的 DataFrame:
ID Values
0 1 A
0 1 B
0 1 C
1 2 D
1 2 E
1 2 F
2.2 split函数使用
str中的split函数是对一列的字符串安装某个分隔符进行切分,然后将其转换成列表的操作。
import pandas as pd
df = pd.DataFrame({'a':[1,2,3], 'b':[2,3,4], 'c':['a, b,c', 'b,c', 'd,e']})
df['c'] = df['c'].str.split(',')
df
a b c
0 1 2 [a, b, c]
1 2 3 [b, c]
2 3 4 [d, e]
接着我们可以将上述的安装c列通过explode函数对其进行展开,具体如下:
df.explode('c')
a b c
0 1 2 a
0 1 2 b
0 1 2 c
1 2 3 b
1 2 3 c
2 3 4 d
2 3 4 e
🔍 3. 高阶用法
3.1 explode函数底层解析
上次的操作直接使用explode函数进行,下面将explode的执行过程给大家进行解析,方便理解,具体代码如下所示:
import pandas as pd
df = pd.DataFrame({'a':[1,2,3], 'b':[2,3,4], 'c':['a, b,c', 'b,c', 'd,e']})
a b c
0 1 2 a, b,c
1 2 3 b,c
2 3 4 d,e
# 接下来,我们将'a'和'b'列设置为索引,并选择'c'列:
df = df.set_index(['a', 'b'])['c']
a b
1 2 a, b, c
2 3 b, c
3 4 d, e
Name: c, dtype: object
然后,我们使用str.split方法将’c’列中的字符串按逗号分割,并设置expand=True来将分割后的列表转换为单独的列:
df = df.str.split(',', expand=True)
0 1 2
0 a b c
1 b c NaN
2 d e NaN
# 接着,我们使用stack方法将列转换为行,创建一个层次化索引:
df = df.stack()
a b
1 2 a 0
2 b 1
3 c 2
2 3 b 0
3 4 d 0
4 e 1
dtype: object
然后,我们使用reset_index方法重置索引,并在drop=True参数下删除原来的列索引:
df = df.reset_index(drop=True, level=1)
a 0
0 1 a
1 1 b
2 1 c
3 2 b
4 3 d
5 3 e
# 最后,我们再次使用reset_index方法重置索引,并将列名0改为'c':
df = df.reset_index().rename(columns={0:'c'})
a b c
0 1 2 a
1 1 2 b
2 1 2 c
3 2 3 b
4 3 4 d
5 3 4 e
🔍 4. 注意事项
对上述的各个函数在使用的过程中需要注意的一些事项,不然可能会出现error,具体主要为:
- explode只适用于一维序列,如果你的数据是多维的(如二维数组),则需要先将其展平。
- 如果序列中包含NaN或其他缺失值,explode会将它们转换为对应行中的缺失值。
- explode默认不会改变其他列的数据,如果需要,可以通过ignore_index参数重置索引。
🔧 5. 总结
explode是Pandas中一个非常实用的函数,特别适合处理列表或数组类型的数据。通过explode,我们可以轻松地将一行中的序列值转换为多行,从而简化数据操作和分析。本文通过实际的代码示例和输出结果,展示了explode的使用方法和效果,希望能够帮助读者更好地理解和应用这个函数。