如何在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
相关产品推荐
相关产品推荐

