如何拆分Pandas DataFrame中的列并保留每条记录的关联键信息
如何拆分DataFrame的列并保留其余列的对应数据?
首先来看你的原始数据和需求:
你有这样的初始DataFrame:
import pandas as pd df = pd.DataFrame( {"ID": ["P-1", "P-2", "P-3"], "Acc No": ['11234/57468/28576', '13245/13246', '46578/37264/35264'], "Company": ["red", "yellow", "blue"]} ) print(df)
输出:
ID Acc No Company 0 P-1 11234/57468/28576 red 1 P-2 13245/13246 yellow 2 P-3 46578/37264/35264 blue
你希望把Acc No列按/拆分后,每个拆分出的条目都对应原有的ID和Company数据,得到这样的目标结果:
df2 = pd.DataFrame( {"ID": ["P-1","P-1","P-1", "P-2","P-2", "P-3","P-3","P-3"], "Acc No": ['11234','57468','28576', '13245','13246', '46578','37264','35264'], "Company": ["red", "red","red","yellow", "yellow", "blue", "blue", "blue"]} ) print(df2)
解决方案:用explode()轻松实现
这个需求其实用pandas的explode()方法就能完美解决,步骤非常简单:
- 先把
Acc No列拆成列表:用str.split('/')将每个字符串按斜杠分割成列表,替换原列 - 用
explode()展开列表:这个方法会自动把列表里的每个元素单独生成一行,同时保留其他列的对应值
完整代码如下:
import pandas as pd df = pd.DataFrame( {"ID": ["P-1", "P-2", "P-3"], "Acc No": ['11234/57468/28576', '13245/13246', '46578/37264/35264'], "Company": ["red", "yellow", "blue"]} ) # 1. 将Acc No列拆分为列表 df['Acc No'] = df['Acc No'].str.split('/') # 2. 展开列表,生成目标DataFrame df2 = df.explode('Acc No', ignore_index=True) print(df2)
运行后你就能得到想要的输出:
ID Acc No Company 0 P-1 11234 red 1 P-1 57468 red 2 P-1 28576 red 3 P-2 13245 yellow 4 P-2 13246 yellow 5 P-3 46578 blue 6 P-3 37264 blue 7 P-3 35264 blue
补充:旧版本pandas的替代方法
如果你的pandas版本低于0.25(explode()是0.25版本新增的),可以用apply结合stack的方式实现:
df2 = df.set_index(['ID', 'Company'])['Acc No'].str.split('/', expand=True).stack().reset_index(name='Acc No').drop('level_2', axis=1)
不过还是推荐优先用explode(),代码更简洁易懂,维护起来也方便。
内容的提问来源于stack exchange,提问作者routine_dizzy
相关产品推荐
相关产品推荐

