
本文介绍如何对 Pandas Series 中的字符串(如 ">3"、"
本文介绍如何对 pandas series 中的字符串(如 `">3"`、`"
在数据清洗中,常需从带前缀符号(如 , >, , >, ~, ≈ 等)或非数字字符的字符串中提取核心数值,并将无效项(如 'NA'、空字符串)统一转为 NaN。直接使用 .replace() 配合不严谨的正则易报错(如 bad escape \d),或无法处理缺失值与非匹配项。
正确做法是:用 str.extract() 提取首个浮点模式,再显式转换为浮点型,自动将无匹配项转为 NaN —— 这比 replace(..., regex=True) 更健壮、语义更清晰。
以下为完整解决方案:
import pandas as pd
import numpy as np
df = pd.DataFrame({
'col1': [1, np.nan, '>3', 'NA'],
'col2': ['3.', '<p>输出:</p><pre class="brush:php;toolbar:false;"> col1 col2
0 1.0 3.0
1 NaN 5.0
2 3.0 NaN
3 NaN NaN
✅ 关键说明:
-
astype(str)确保所有值(含np.nan)转为字符串('nan'),使.str.extract()可安全运行; -
str.extract(..., expand=False)返回 Series,仅取第一个捕获组(即数字部分); - 最终
astype(float)自动将无法转为数字的值(如'nan','NA', 空字符串)转为NaN; - 正则
^[^\w+-\.]*([+-]?\d*\.?\d+)含义:-
^:行首锚定; -
[^\w+-\.]*:跳过开头任意非字母数字、非_+-.的字符(兼容,>等 HTML 实体残留); -
([+-]?\d*\.?\d+):捕获组内匹配带符号、可缺省整数/小数部分的有效数字(注意\.转义点号)。
-
⚠️ 注意事项:
- 避免在
replace(regex=True)中使用反向引用\1作为替换值(Pandas 不支持该语法,会静默失败); - 不要直接用
r"\d+"等简单模式——它无法处理小数(如"3."或".5"),且会截断负号; - 若需保留原始
NaN而非转为字符串'nan',可先用mask预过滤:s_clean = s.mask(s.isna(), '').astype(str).str.extract(float_pattern, expand=False).astype(float)
此方法兼顾鲁棒性、可读性与工程实践,是清洗混合符号数值字段的标准范式。










