按分隔符拆分DataFrame列并生成两两组合的新行
问题
现有如下Pandas DataFrame,需要将path列按>分隔符拆分,生成相邻两个元素组合的新行(比如SPAM>EGGS>BACON>HAM要拆成SPAM>EGGS、EGGS>BACON、BACON>HAM),预期结果如下。目前用split+explode只能拆成单个元素,无法实现两两分组的效果。
示例DataFrame代码
import pandas as pd df = pd.DataFrame({ 'path': ['SPAM>EGGS>BACON>HAM', 'SPAM>EGGS>HAM', 'SPAM>EGGS>HAM', 'SPAM>HAM'], 'arrival_time': ['2/4/23 20:30', '2/5/23 2:24', '2/5/23 0:28', '2/3/23 0:28'], 'departure_time': ['2/4/23 22:00', '2/5/23 2:54', '2/5/23 1:28', '2/3/23 1:28'] })
预期结果
path arrival_time departure_time 0 SPAM>EGGS 2/4/23 20:30 2/4/23 22:00 1 EGGS>BACON 2/4/23 20:30 2/4/23 22:00 2 BACON>HAM 2/4/23 20:30 2/4/23 22:00 3 SPAM>EGGS 2/5/23 2:24 2/5/23 2:54 4 EGGS>HAM 2/5/23 2:24 2/5/23 2:54 5 SPAM>EGGS 2/5/23 0:28 2/5/23 1:28 6 EGGS>HAM 2/5/23 0:28 2/5/23 1:28 7 SPAM>HAM 2/3/23 0:28 2/3/23 1:28
当前尝试的代码(无效)
df['path'] = df['path'].str.split(pat='>').explode('path')
解决方案
要实现相邻元素两两组合的拆分,可以按以下方式处理:
import pandas as pd df = pd.DataFrame({ 'path': ['SPAM>EGGS>BACON>HAM', 'SPAM>EGGS>HAM', 'SPAM>EGGS>HAM', 'SPAM>HAM'], 'arrival_time': ['2/4/23 20:30', '2/5/23 2:24', '2/5/23 0:28', '2/3/23 0:28'], 'departure_time': ['2/4/23 22:00', '2/5/23 2:54', '2/5/23 1:28', '2/3/23 1:28'] }) # 拆分path为元素列表,生成相邻元素的组合 df['path'] = df['path'].str.split('>').apply( lambda lst: [f"{lst[i]}>{lst[i+1]}" for i in range(len(lst)-1)] ) # 展开组合并重置索引 result = df.explode('path').reset_index(drop=True) print(result)
关键步骤说明
- 生成相邻组合:先用
str.split('>')将每个path字符串拆分为元素列表,再通过apply遍历列表,循环取相邻两个元素拼接成X>Y格式的字符串,组成新列表; - 拆分新行:
explode('path')会把列表中的每个组合拆分为独立行,同时保留arrival_time和departure_time的对应值; - 重置索引:
reset_index(drop=True)让结果的索引连续,与预期格式一致。
内容的提问来源于stack exchange,提问作者1234567
相关产品推荐
相关产品推荐

