假设有这么一组数据:
>>> df = pd.DataFrame([{'编码':'01', '价格':'1.1,1.3,3.4', '水果':'苹果,柿子,梨'},{'编码':'01', '价格':'2.2,3.4', '水果':'桔子,香蕉'}])
>>> print(df)
编码 价格 水果
0 00 1.1,1.3,3.4 苹果,柿子,梨
1 01 2.2,3.4 桔子,香蕉
其中价格和水果是按照位置一一对应的,如苹果:1.1、柿子:1.3、梨:3.4,我们希望将价格与水果两列都拆开,但又不影响水果名与价格的对应关系
编码 价格 水果
0 00 1.1 苹果
1 00 1.3 柿子
2 00 3.4 梨
3 01 2.2 桔子
4 01 3.4 香蕉
通过如下操作即可实现
>>> df.set_index(['编码']).apply(lambda x: x.str.split(',').explode()).reset_index()
其中set_index和reset_index()是为了锁定编码列,防止误将其进行拆分,上面例子中编码列不存在逗号,因而这步加不加对结果没有影响。
在使用过程中发现,如果set_index中列数过多容易报错,因而可将原表拆为两部分,一部分为不需要拆分的列,另一部分仅为需要拆分的列;然后将后者拆分后再通过某公共列进行merge。
参考:https://stackoverflow.com/a/50731254