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

如何删除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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 19:15:05