如何删除pandas DataFrame中数值后方附带的多余非预期字符
处理方案
核心思路
你的需求本质是提取字符串开头的数字(支持整数/带小数的数值),忽略数字之后所有的无关字符(million、引用标注等),用正则匹配处理效率最高。
方法1:直接提取目标数值(推荐)
用pandas的str.extract方法捕获开头的数字部分,一步到位:
# 假设待处理的列名为 raw_value,处理后存入 cleaned_value 列 df['cleaned_value'] = df['raw_value'].str.extract(r'^(\d+\.?\d*)').astype(float)
正则说明:
^匹配字符串开头\d+匹配至少1位数字\.?匹配可选的小数点\d*匹配小数点后可选的数字- 括号
()包裹的部分是要提取的捕获组
方法2:用replace删除无关内容
如果你习惯用str.replace,可以匹配第一个非数字/小数点字符之后的所有内容,替换为空:
df['cleaned_value'] = df['raw_value'].str.replace(r'[^\d.].*$', '', regex=True).astype(float)
正则说明:
[^\d.]匹配不是数字、也不是小数点的字符.*$匹配从这个字符开始到字符串结尾的所有内容
常见问题说明
你之前用str.replace没生效大概率是没开regex=True参数(pandas 2.0+版本该参数默认是False,仅支持替换固定字符串);str.strip只能移除首尾指定的单个字符,无法匹配模式化的多余内容,不适合这个场景。
测试验证
拿你给出的示例数据测试:
import pandas as pd # 模拟你的数据 df = pd.DataFrame({ 'raw_value': [ '19.5million[1][b]', '16million[5][6][7][d]', '13.2million[11][e]' ] }) # 执行处理 df['cleaned_value'] = df['raw_value'].str.extract(r'^(\d+\.?\d*)').astype(float) print(df['cleaned_value'])
输出结果:
0 19.5 1 16.0 2 13.2 Name: cleaned_value, dtype: float64
如果不需要小数可以把astype(float)改成astype(int)或者按需调整。
内容的提问来源于stack exchange,提问作者Nicholas Borodach
相关产品推荐
相关产品推荐

