如何在Pandas DataFrame中拆分多列并解决重索引报错
解决Pandas按分隔符拆分并展开多列的问题
问题场景
原始DataFrame:
preferred_title_symbol mim_number MDR_code MDR_term 0 17-BETA HYDROXYSTEROID DEHYDROGENASE III 264300.0 10037122 pseudohermaphroditism 1 2,4-DIENOYL-CoA REDUCTASE DEFICIENCY 616034.0 10027417 | 10081311 | 10059750 leukodystrophy | metabolic acidosis | muscle retention
需要将MDR_code和MDR_term列按分隔符|拆分后展开,得到预期输出:
preferred_title_symbol mim_number MDR_code MDR_term 0 17-BETA HYDROXYSTEROID DEHYDROGENASE III 264300.0 10037122 pseudohermaphroditism 1 2,4-DIENOYL-CoA REDUCTASE DEFICIENCY 616034.0 10027417 leukodystrophy 1 2,4-DIENOYL-CoA REDUCTASE DEFICIENCY 616034.0 10081311 metabolic acidosis 1 2,4-DIENOYL-CoA REDUCTASE DEFICIENCY 616034.0 10059750 muscle retention
错误原因分析
你之前的代码报错ValueError: cannot reindex on an axis with duplicate labels,核心原因是explode操作后,拆分出的多条记录会保留原行索引(比如行1拆分后生成3条索引为1的记录),此时用join关联原DataFrame的列时,原列的索引只有0和1,无法匹配重复索引,导致索引冲突。另外原始数据中|前后带有空格,拆分后需要额外处理才能去除冗余空格。
正确解决方案
方法一:拆分后同时展开多列(推荐)
先对目标列完成字符串拆分(同时处理空格),再一次性explode多列,自动保留其他列的对应值:
import pandas as pd # 拆分列,用正则匹配带空格的分隔符,同时去除前后空格 df['MDR_code'] = df['MDR_code'].str.split(r'\s*\|\s*') df['MDR_term'] = df['MDR_term'].str.split(r'\s*\|\s*') # 同时展开两列,自动关联其他列数据 result = df.explode(['MDR_code', 'MDR_term'])
方法二:用apply逐行处理
如果需要更灵活的自定义逻辑,可以用apply将每行的拆分结果转为Series后展开:
result = df.apply( lambda row: pd.Series({ 'preferred_title_symbol': row['preferred_title_symbol'], 'mim_number': row['mim_number'], 'MDR_code': row['MDR_code'].split(r'\s*\|\s*'), 'MDR_term': row['MDR_term'].split(r'\s*\|\s*') }).explode(), axis=1 ).reset_index(drop=False).rename(columns={'index': 'original_index'})
两种方法都能实现预期效果,且解决了空格冗余和索引冲突的问题。
内容的提问来源于stack exchange,提问作者rshar
相关产品推荐
相关产品推荐

