一、介绍
通过 explode
可以实现列转行的功能。
explode
这个爆炸方法只能处理列表、元组、Series等类型。
二、实操
# 创建测试集
import pandas as pd
df = pd.DataFrame({'Name':['吕布','貂蝉','赵云'],
'Hobby':[['打篮球','玩游戏','喝奶茶'],['敲代码','看电影'],['听音乐','健身']]})
'''
Name Hobby
0 吕布 [打篮球, 玩游戏, 喝奶茶]
1 貂蝉 [敲代码, 看电影]
2 赵云 [听音乐, 健身]
'''
# 原地爆炸!!!
df.explode('Hobby')
# 列表有重复值 可能存在重复行
df.explode('Hobby').drop_duplicates().reset_index(drop=True)
'''
Name Hobby
0 吕布 打篮球
1 吕布 玩游戏
2 吕布 喝奶茶
3 貂蝉 敲代码
4 貂蝉 看电影
5 赵云 听音乐
6 赵云 健身
'''
如果数据框中数据为非可爆炸的类型,则可提前进行分列操作。
df2 = pd.DataFrame({'Name':['吕布','貂蝉','赵云'],
'Hobby':['打篮球,玩游戏,喝奶茶','敲代码,看电影','听音乐,健身']})
df2.explode('Hobby') # Not Work
df2['Hobby2'] = df2['Hobby'].str.split(',')
# df2['Hobby2'] = df2['Hobby'].apply(lambda x: x.split(','))
df2.explode('Hobby2')
'''
Name Hobby Hobby2
0 吕布 打篮球,玩游戏,喝奶茶 打篮球
0 吕布 打篮球,玩游戏,喝奶茶 玩游戏
0 吕布 打篮球,玩游戏,喝奶茶 喝奶茶
1 貂蝉 敲代码,看电影 敲代码
1 貂蝉 敲代码,看电影 看电影
2 赵云 听音乐,健身 听音乐
2 赵云 听音乐,健身 健身
'''
三、实践题
- 列转行拆分爆炸
import pandas as pd
import numpy as np
df = pd.read_excel(r'C:\Users\Hider\Desktop\data.xlsx')
'''
年级 姓名
0 1 A1;B1;C1
1 2 A2;B2;C2
2 3 A3;B3;C3
3 4 A4;B4;C4
4 5 A5;B5;C5
5 6 A6;B6;C6
6 7 A7;B7;C7
7 8 A8;B8;C8
8 9 A9;B9;C9
'''
df.columns # Index(['年级', '姓名'], dtype='object')
df['新列'] = df['姓名'].str.split(';')
df1 = df.explode('新列')
- 还原
# 数据还原
def func(df):
x = ','.join(df.values)
return x
df2 = df1.groupby('年级').agg(func).reset_index()
参考链接:pandas100个骚操作五:使用 explode 实现 pandas 列转行的 2 个常用技巧