我们常有这样一个需求,把一列的值分割扩展为多行
>>>x = pd.DataFrame({1:range(4), 2:range(4,8), 3:[str(_) + ',' + str(_) for _ in range(8,12)]})
1 2 3
0 0 4 8,8
1 1 5 9,9
2 2 6 10,10
3 3 7 11,11
转为如下形式
>>>x.drop(3,axis=1).join(x[3].str.split(',',expand=True).stack().reset_index(level=1,drop=1).rename('new_3'))
1 2 new_3
0 0 4 8
0 0 4 8
1 1 5 9
1 1 5 9
2 2 6 10
2 2 6 10
3 3 7 11
3 3 7 11
...
我们通过join
来组合原dataframe和分割后的dataframe
join
默认按索引、left模式合并两个dataframe,因此只需要join索引对应split后的结果即可
# 分割第3列,可以看到展开为两列,展开的列数按最大列数
>>>x[3].str.split(',',expand=True)
0 1
0 8 8
1 9 9
2 10 10
3 11 11
# 合并多列,这里会生成多级索引
>>>x.stack()
0 0 8
1 8
1 0 9
1 9
2 0 10
1 10
3 0 11
1 11
# 删除第1级索引
>>>x.reset_index(level=1,drop=True)
0 8
0 8
1 9
1 9
2 10
2 10
3 11
3 11
# 接下来重命名,join即可
>>>x.drop(3,axis=1).join(x[3].str.split(',',expand=True).stack().reset_index(level=1,drop=1).rename('new_3'))
1 2 new_3
0 0 4 8
0 0 4 8
1 1 5 9
1 1 5 9
2 2 6 10
2 2 6 10
3 3 7 11
3 3 7 11