Python Pandas拆分非标准Name-ID-Date格式DataFrame列问题求助
DataFrame多列非标准分隔内容拆分解决方案
问题根因
原有代码报错的核心原因是:当Candidate列内容不符合「Name-ID-Date三段以-分隔」的规则时,str.split(expand=True)返回的列数不足3列,直接赋值给[['Name','Id','Sdate']]会触发维度不匹配错误,同时双重循环+逐次append的写法数据处理效率极低,不适合大数据量场景。
优化实现方案
采用「宽表转长表+自定义容错拆分函数」的方案,既兼容非标准格式,又大幅提升处理效率:
import pandas as pd # 1. 定义需要处理的列 all_candidates = [f'Candidate{i}' for i in range(1,29)] use_cols = ['PPS_REQ'] + all_candidates # 2. 筛选数据并将宽表转为长表,避免循环遍历列 dff = df[use_cols].melt(id_vars='PPS_REQ', var_name='Candidate_col', value_name='Candidate_raw') # 3. 自定义容错拆分函数,可根据你的非标准格式规则补充清洗逻辑 def split_candidate_info(val): # 空值直接返回空 if pd.isna(val): return pd.Series([None, None, None], index=['Name','Id','Sdate']) # 可在这里补充非标准格式的预处理规则,比如替换其他分隔符为-:val = val.replace('_','-').replace('|','-') parts = str(val).split('-') # 不足3段的补空,超过3段的取前3段(可根据你的业务规则调整) if len(parts) >=3: return pd.Series([parts[0].strip(), parts[1].strip(), parts[2].strip()], index=['Name','Id','Sdate']) elif len(parts) ==2: return pd.Series([parts[0].strip(), parts[1].strip(), None], index=['Name','Id','Sdate']) elif len(parts) ==1: return pd.Series([parts[0].strip(), None, None], index=['Name','Id','Sdate']) else: return pd.Series([None, None, None], index=['Name','Id','Sdate']) # 4. 批量拆分得到三个字段 dff[['Name','Id','Sdate']] = dff['Candidate_raw'].apply(split_candidate_info) # 最终结果存在dff中,可根据需求过滤掉空值或者Candidate_raw为空的行
自定义规则扩展说明
如果你的非标准格式有明确的规则(比如部分内容用下划线分隔、日期段放在首位等),可直接在split_candidate_info函数的预处理部分补充对应的转换逻辑,即可适配不同的混乱输入格式。
内容的提问来源于stack exchange,提问作者Anup Dutta
相关产品推荐
相关产品推荐

