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

