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

