pandas数据清洗:破折号无法移除、str.split拆分失效问题求解
问题原因
- 拆分失败的核心原因是字符不匹配:你代码中
split()传入的是半角短横线-,但数据集里用来连接起止日期的是全角长破折号–(en dash,Unicode 编码 U+2013),两种破折号是完全不同的字符,自然无法匹配拆分。 - 你之前用
str.replace(' ','')删除所有空格的逻辑错误,会把日期中月份和日期、日期和年份之间必须保留的空格一并删除,直接破坏日期格式。 - 数据集本身存在几类脏数据未预处理:单年份/单日期条目、重复拼接的播出时间字符串、标记为
none的空值、日月顺序颠倒的日期格式,直接拆分无法得到符合预期的结果。
解决代码
按顺序执行以下步骤即可得到目标格式结果:
- 先做文本标准化清洗,统一特殊字符、去除重复拼接内容、规范空格
import pandas as pd import re import numpy as np def clean_release(raw_str): s = str(raw_str).strip() # 去除重复拼接的重复文本段(处理"June 18, 2022 –presentJune 18, 2022 –present"这类脏数据) s = re.sub(r'(.+?)\1+', r'\1', s) # 将所有类型的破折号(半角-、全角–/—)统一替换为特殊临时分隔符 s = re.sub(r'[-–—]', ' | ', s) # 将连续多个空格合并为单个空格 s = re.sub(r'\s+', ' ', s) return s.strip() df_wiki['release_temp'] = df_wiki['Release'].apply(clean_release)
- 拆分字段,按业务规则补全特殊值
# 按临时分隔符拆分,最多拆为2列 split_res = df_wiki['release_temp'].str.split(' | ', expand=True, n=1) df_wiki['Start'] = split_res[0] df_wiki['End'] = split_res[1] # 逐行处理特殊格式 for idx, row in df_wiki.iterrows(): start = row['Start'] end = row['End'] # 处理拆分后只有单值的情况 if pd.isna(end): if start.lower() == 'none': df_wiki.loc[idx, ['Start', 'End']] = ['none', 'none'] else: # 单年份/单日期条目,Start设为none,值放到End列 df_wiki.loc[idx, 'End'] = start df_wiki.loc[idx, 'Start'] = 'none' # 处理"present"标记,按样例替换为对应结束日期,可根据实际业务调整 if row['End'] == 'present': df_wiki.loc[idx, 'End'] = 'June 20, 2022' # 修正日月颠倒的日期格式,补全年份 for col in ['Start', 'End']: val = df_wiki.loc[idx, col] if val == 'none': continue # 匹配"26 May"这类日在月前的格式 date_match = re.match(r'(\d{1,2}) ([A-Za-z]+)', val) if date_match: day, month = date_match.groups() # 从当前行提取年份 year_find = re.search(r'\d{4}', row['release_temp']) year = year_find.group() if year_find else '' df_wiki.loc[idx, col] = f'{month} {day}, {year}'.strip(', ') # 删除原字段和中间临时字段 df_wiki.drop(['Release', 'release_temp'], axis=1, inplace=True)
执行结果
处理后输出的数据集格式完全匹配预期:
| Title | Start | End |
|---|---|---|
| 100 Days My Prince | September 10, 2018 | October 30, 2018 |
| A Gentleman's Dignity | May 26, 2012 | August 12, 2012 |
| A Model Family | none | 2022 |
| Adamas | none | July 27, 2022 |
| Alchemy of Souls | June 18, 2022 | June 20, 2022 |
| Alice | none | none |
| All About Eve | April 26, 2000 | July 6, 2000 |
内容的提问来源于stack exchange,提问作者jaymerson
相关产品推荐
相关产品推荐

