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

如何用Python正则从Pandas DataFrame字符串提取结尾的数字或小数?

问题描述

需要从Pandas DataFrame的Names列中,仅提取那些以数字或小数结尾的字符串中的数值。示例DataFrame如下:

import pandas as pd
df = pd.DataFrame({'Names': ["Absolute Neutrophil Count","Absolute Lymphocyte Count 2.9",
                       "Absolute Neutrophil Count 10.2","ESR (Modified Westergren) 8",
                        "Free Triiodothyronine (FT3) 3.59",
                        "Free Triiodothyronine FT4 4.53"]})

期望提取结果为:

0  Missing/None
1  2.9
2  10.2
3  8
4  3.59
5  4.53

尝试了以下代码但未得到预期结果:

df.iloc[:,0].str.extract(r'^(.*?)\s*(\d\.?\d*)?$') #  '\d+\.\d+'

错误输出为:

0      1
0   Absolute Neutrophil Count     NaN
1   Absolute Lymphocyte Count     2.9
2   Absolute Neutrophil Count 1   0.2
3   ESR (Modified Westergren)     8
4   Free Triiodothyronine (FT3)   3.59
5   Free Triiodothyronine FT4     4.53

要求使用DataFrame的str.extract方法解决,避免使用re模块或字符串处理方法。

解决方案

之前的正则表达式错误在于,\d\.?\d*会匹配单个数字后接可选小数点和数字,导致像10.2这类数值被错误拆分。正确的做法是锚定字符串末尾,匹配结尾的整数或小数。

使用以下代码即可实现需求:

# 提取末尾的整数或小数,返回Series
result = df['Names'].str.extract(r'(\d+\.?\d*)$', expand=False)
# 将缺失值替换为指定文本
result = result.fillna("Missing/None")
print(result)

运行后输出:

0    Missing/None
1             2.9
2            10.2
3               8
4            3.59
5            4.53
Name: Names, dtype: object

正则表达式说明

  • (\d+\.?\d*):匹配一个或多个数字开头,可选的小数点,再跟随零个或多个数字,能覆盖整数(如8)和各种格式的小数(如2.9、3.59)。
  • $:锚定到字符串结尾,确保只提取位于末尾的数值,不会误匹配字符串中间的数字(比如FT3中的3不会被提取)。
  • expand=False:设置为False后返回Series,格式更贴合期望的输出结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 15:58:13