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

如何优化DataFrame指定列中非ASCII字符(含中日文)的处理?

替换DataFrame指定列中非ASCII字符的优化方案

你的现有代码通过删除包含非英文(非ASCII)字符的行处理数据,但针对中日文这类非ASCII内容,除了删除外,还有以下更灵活的解决方案,同时也会优化原有删除逻辑的效率:

一、非删除类替代方案

1. 用占位符替换非ASCII字符

适合需要保留文本结构、仅标记非ASCII内容的场景,利用正则快速替换:

import pandas as pd

# 指定要处理的目标列
target_cols = ["column_name1", "column_name2"]

# 将所有非ASCII字符替换为[NON-ASCII]占位符
df[target_cols] = df[target_cols].apply(lambda x: x.str.replace(r'[^\x00-\x7F]', '[NON-ASCII]', regex=True))

2. 中日文转罗马音/拼音(保留可读信息)

如果希望保留文本的发音信息,可借助第三方库转换:

  • 中文转拼音:使用pypinyin
  • 日文转罗马音:使用romkan

示例代码:

import pandas as pd
from pypinyin import lazy_pinyin
import romkan
import re

def convert_non_ascii(text):
    if not isinstance(text, str):
        return text
    # 中文转拼音(不带声调)
    text = ''.join(lazy_pinyin(text))
    # 日文转罗马音
    text = romkan.to_roma(text)
    # 清理残留的非ASCII字符
    return re.sub(r'[^\x00-\x7F]', '', text)

target_cols = ["column_name1", "column_name2"]
df[target_cols] = df[target_cols].applymap(convert_non_ascii)

3. 保留原文本但添加标记列

如果不想修改原数据,仅需标记含非ASCII的行用于后续分析:

target_cols = ["column_name1", "column_name2"]
# 生成标记列:任一目标列含非ASCII则标记为True
df["has_non_ascii"] = df[target_cols].apply(lambda x: x.str.contains(r'[^\x00-\x7F]', regex=True)).any(axis=1)

二、原有删除逻辑的高效优化

你的现有代码用apply(axis=1)逐行处理效率较低(大数据量下尤为明显),且逻辑存在错误(else False and ...会导致判断失效),改用矢量化操作优化:

import pandas as pd
import re

target_cols = ["column_name1", "column_name2"]
# 匹配允许的ASCII字符正则
ascii_pattern = r'^[A-Za-z0-9\s.,!?\'\"()@#$%^&*;:\[\]{}±_+=/\\|`~]*$'

# 生成布尔掩码:所有目标列都符合ASCII规则才保留
mask = df[target_cols].apply(lambda x: x.astype(str).str.match(ascii_pattern)).all(axis=1)
# 筛选符合条件的行
df_cleaned = df[mask]

矢量化操作比逐行apply效率提升数倍,且逻辑更清晰。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 08:11:07