假设有如下数据:
id | value1 | value2 | value3 |
---|---|---|---|
张三 | a2,a4,a5 | 1,3,5 | 0.5,-0.5,-3 |
李四 | a3,a4,a7 | 1,3,6 | 0.8,-0.5,-3 |
麻子 | a2,a4,a8 | 2,4,6 | -0.5,0.4,3 |
需求是将每个id的value值展开至多行,刚开始我尝试硬写代码来实现拆分,结果发现代码很麻烦,而且数据量大时性能很差,其实可以使用dataframe自带的explode()函数来拆分,只需一行代码即可实现,且性能很好,实测约提升了10倍。
#构建数据集
import pandas as pd
dic = {
'id':['张三','李四','麻子'],
'value1':['a2,a4,a5','a3,a4,a7','a2,a4,a8'],
'value2':['1,3,5','1,3,6','2,4,6'],
'value3':['0.5,-0.5,-3','0.8,-0.5,-3','-0.5,0.4,3']
}
before=pd.DataFrame(dic)
before.to_csv('before.csv',encoding='gbk')
after = before.set_index(['id']).apply(lambda x: x.str.split(',').explode()).reset_index()
after
输出如下:
id | value1 | value2 | value3 |
---|---|---|---|
张三 | a2 | 1 | 0.5 |
张三 | a4 | 3 | -0.5 |
张三 | a5 | 5 | -3 |
李四 | a3 | 1 | 0.8 |
李四 | a4 | 3 | -0.5 |
李四 | a7 | 6 | -3 |
麻子 | a2 | 2 | -0.5 |
麻子 | a4 | 4 | 0.4 |
麻子 | a8 | 6 | 3 |