You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pandas数据清洗:破折号无法移除、str.split拆分失效问题求解

问题原因
  • 拆分失败的核心原因是字符不匹配:你代码中split()传入的是半角短横线 -,但数据集里用来连接起止日期的是全角长破折号 –(en dash,Unicode 编码 U+2013),两种破折号是完全不同的字符,自然无法匹配拆分。
  • 你之前用str.replace(' ','')删除所有空格的逻辑错误,会把日期中月份和日期、日期和年份之间必须保留的空格一并删除,直接破坏日期格式。
  • 数据集本身存在几类脏数据未预处理:单年份/单日期条目、重复拼接的播出时间字符串、标记为none的空值、日月顺序颠倒的日期格式,直接拆分无法得到符合预期的结果。
解决代码

按顺序执行以下步骤即可得到目标格式结果:

  1. 先做文本标准化清洗,统一特殊字符、去除重复拼接内容、规范空格
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)
  1. 拆分字段,按业务规则补全特殊值
# 按临时分隔符拆分,最多拆为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)
执行结果

处理后输出的数据集格式完全匹配预期:

TitleStartEnd
100 Days My PrinceSeptember 10, 2018October 30, 2018
A Gentleman's DignityMay 26, 2012August 12, 2012
A Model Familynone2022
AdamasnoneJuly 27, 2022
Alchemy of SoulsJune 18, 2022June 20, 2022
Alicenonenone
All About EveApril 26, 2000July 6, 2000

内容的提问来源于stack exchange,提问作者jaymerson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 13:57:08