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

如何在Pandas中删除包含无效乱码字符的数据行?

删除Pandas DataFrame含乱码的行(避免误删有效数据)

核心思路

放弃isalnum()的严格字母数字判定,通过正则匹配合法字符范围或过滤不可打印字符,精准区分乱码与有效数据(如日期、小数点、下划线等)。

方法一:正则匹配指定合法字符

先明确允许的字符集合(覆盖业务场景),再用正则逐行验证。

示例代码

import pandas as pd

# 定义正则:允许字母、数字、日期/符号(.-_:/+T)、中文、空格
valid_pattern = r'^[a-zA-Z0-9\.\-_\:/\+T\u4e00-\u9fa5\s]*$'

# 测试用DataFrame
df = pd.DataFrame({
    'time': ['2023-04-24T10:44:20.4912482+00:00', 'invalidÃ', '2023/05/01'],
    'content': ['user_123', '乱码âbc', 'price:99.9']
})

# 逐行检查:所有字符是否都在合法范围内
def is_valid(row):
    row_str = ' '.join(str(val) for val in row)
    return pd.Series(row_str).str.match(valid_pattern).iloc[0]

# 过滤后的数据
clean_df = df[df.apply(is_valid, axis=1)]
print(clean_df)

说明

  • 正则里的\u4e00-\u9fa5是中文范围,不需要可直接删掉;
  • 若只需检查特定列,修改is_valid函数,只拼接目标列内容即可。

方法二:过滤不可打印字符

如果乱码多为不可见的控制字符,直接保留所有可打印字符更高效:

import pandas as pd
import string

# 所有可打印字符集合
printable_chars = set(string.printable)

def has_no_gibberish(row):
    row_str = ' '.join(str(val) for val in row)
    return all(char in printable_chars for char in row_str)

clean_df = df[df.apply(has_no_gibberish, axis=1)]

方法三:针对单列快速过滤

如果只需要清洗某一列,不用逐行遍历,直接用str.contains反向过滤:

# 保留col1中不含非法字符的行(非法字符指不在合法集合中的)
clean_df = df[~df['col1'].str.contains(r'[^a-zA-Z0-9\.\-_\:/\+T\u4e00-\u9fa5\s]', na=False)]

这里的^在方括号内表示“非”,na=False处理空值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 04:05:13