
本文介绍如何对 NumPy 字符串数组中的每个元素统一执行文本清洗操作——移除所有空格、将半角逗号(,)替换为英文小数点(.),适用于金融数据、CSV 导入后格式标准化等场景。
在处理从波兰证券交易所等来源获取的结构化文本数据时,常见数值字段(如成交额、市盈率)以带空格分隔的千位格式(如 '1 386 216 000')和欧洲风格小数(如 '0,891')存储。这类数据直接用于数值计算前,必须清洗为标准数字格式(如 '1386216000' 和 '0.891')。由于原始数据已加载为 dtype='<U14' 的二维 NumPy 数组,需采用向量化方式高效处理,避免显式 Python 循环。
推荐使用 np.vectorize 封装纯字符串处理函数,既保持代码简洁,又充分利用 NumPy 的广播能力。核心逻辑仅需两步:先用 .replace(' ', '') 删除全部空格;再用 .replace(',', '.') 将逗号转为小数点。注意该顺序不可颠倒——若先替换逗号,后续去空格可能误删其他位置的空格(尽管本例中无此风险,但属良好实践)。
以下是完整可运行示例:
import numpy as np
# 原始数据(已定义为 <U14 类型的二维数组)
data = np.array([
['ALIOR', 'PLALIOR00045', '88 860 000', '1 386 216 000', '0,891', '2,16', '14'],
['CCC', 'PLCCC0000016', '27 918 000', '1 292 603 400', '0,831', '5,28', '42'],
# ...(其余行同上,此处省略以保持简洁)
['TAURONPE', 'PLTAURN00011', '1 043 590 000', '1 252 308 000', '0,805', '1,21', '33']
], dtype='<U14')
# 定义清洗函数
def process_text(text):
return text.replace(' ', '').replace(',', '.')
# 向量化应用(自动广播到数组每个元素)
processed_data = np.vectorize(process_text)(data)
print(processed_data[0]) # 示例输出:['ALIOR' 'PLALIOR00045' '88860000' '1386216000' '0.891' '2.16' '14']注意事项:
- np.vectorize 并非真正意义上的底层向量化(不提升 C 层性能),但对 <U14 字符串数组而言,其开销远低于手动嵌套循环,且语义清晰;
- 若后续需将清洗后的字符串转为数值(如 float 或 int),建议使用 processed_data.astype(float) —— 此时需确保所有列均为有效数字格式(如股票代码列 'ALIOR' 会报错,应按列选择性转换);
- 对于超大规模数组(千万级元素),可考虑结合 numba 或 pandas.Series.str(先转 DataFrame)进一步优化,但本方案已满足绝大多数业务场景需求。
该方法简洁、可靠、易维护,是 NumPy 字符串预处理的标准实践之一。










