使用Pandas按分隔符拆分两列对应行并复制其余列内容
问题与解决方法
需求场景
原始Excel表格结构如下:
Col1 Col2 Col3 Col4 John English\nMaths 34\n33 Pass Sam Science 40 Pass Jack English\nHistory\nGeography 89\n07\n98 Pass
需要将其转换为每行对应单个科目与分数的格式,其他列内容保持不变:
Col1 Col2 Col3 Col4 John English 34 Pass John Maths 33 Pass Sam Science 40 Pass Jack English 89 Pass Jack History 07 Pass Jack Geography 98 Pass
核心要求:Col2(科目)和Col3(分数)以\n为分隔符拆分,每个科目-分数对单独生成一行,其余列内容原样复制。
原尝试代码
split_cols = ['Col2', 'Col3'] # 循环拆分指定列 separator = '\n' for col in split_cols: df[[f'{col}_Split1', f'{col}_Split2']] = df[col].str.split(separator, n=1, expand=True).fillna('') # 创建两个包含目标列的新DataFrame df1 = df[['Col1', 'Col2_Split1', 'Col3_Split1', 'Col4']].rename(columns={'Col2_Split1': 'D', 'Col3_Split1': 'C'}) df2 = df[['Col1', 'Col2_Split2', 'Col3_Split2', 'Col4']].rename(columns={'Col2_Split2': 'D', 'Col3_Split2': 'C'}) # 合并两个DataFrame final_df = pd.concat([df1, df2], ignore_index=True) # 输出结果 print(final_df)
问题分析与优化方案
原代码通过str.split(n=1)仅能拆分出最多两个子项,无法处理像Jack这样有3个及以上科目的情况,通用性不足。
推荐使用Pandas的explode方法,直接对拆分后的列表列进行行展开,确保科目与分数一一对应:
import pandas as pd # 构造示例数据(实际可通过pd.read_excel读取文件) data = { 'Col1': ['John', 'Sam', 'Jack'], 'Col2': ['English\nMaths', 'Science', 'English\nHistory\nGeography'], 'Col3': ['34\n33', '40', '89\n07\n98'], 'Col4': ['Pass', 'Pass', 'Pass'] } df = pd.DataFrame(data) # 将Col2和Col3按\n拆分为列表 df['Col2'] = df['Col2'].str.split('\n') df['Col3'] = df['Col3'].str.split('\n') # 同时展开两个列表列,生成目标格式 final_df = df.explode(['Col2', 'Col3'], ignore_index=True) # 输出结果 print(final_df)
说明
str.split('\n')将单元格内的字符串按换行符拆分为列表,适配任意数量的科目/分数项;explode(['Col2', 'Col3'])会同时展开这两个列表列,保证每一行的科目和分数严格对应;ignore_index=True重置结果的索引,避免重复索引问题。
内容的提问来源于stack exchange,提问作者spd
相关产品推荐
相关产品推荐

