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

如何在Pandas中从文件名字符串提取数字范围作为新列?

问题描述

我有如下列表:

lis=["proc_movieclip1_0.450-16.450.wav", "proc_movieclip1_17.700-23.850.wav", "proc_movieclip1_25.800-29.750.wav"]

通过以下代码转换为Pandas DataFrame:

import numpy as np
import pandas as pd

dfs = pd.DataFrame(mylist2)
dfs.columns=['path']
dfs

得到的DataFrame如下:

path
0   proc_movieclip1_0.450-16.450.wav
1   proc_movieclip1_17.700-23.850.wav
2   proc_movieclip1_25.800-29.750.wav

我希望提取每个path字符串中的数字范围作为新列,预期结果如下:

range 
0.450-16.450
17.700-23.850
25.800-29.750

我尝试了以下代码:

dfs.path.str.extract('(\d+)')

得到的输出为:

0
0   1
1   1
2   1

还尝试了:

dfn = dfs.assign(path = lambda x: x['path'].str.extract('(\d+)'))

结果一样,请问我哪里出错了?

问题原因与解决方法

你之前用的正则表达式(\d+)只能匹配连续的整数数字,而目标字符串里的数字是带小数点的浮点数格式(比如0.450),所以这个正则只会匹配到proc_movieclip1里的1,这就是结果全为1的原因。

要提取数字-数字的完整范围,需要使用能匹配浮点数的正则模式,示例代码如下:

dfs['range'] = dfs.path.str.extract(r'(\d+\.\d+-\d+\.\d+)')

这个正则的含义:

  • \d+:匹配1个或多个整数部分
  • \.:匹配小数点(需转义,因为.在正则中是通配符)
  • \d+:匹配小数点后的数字部分
  • -:匹配连接两个数字的横杠
  • 括号包裹表示提取该分组的内容

执行后,DataFrame会新增range列,结果如下:

path          range
0  proc_movieclip1_0.450-16.450.wav  0.450-16.450
1  proc_movieclip1_17.700-23.850.wav 17.700-23.850
2  proc_movieclip1_25.800-29.750.wav 25.800-29.750

如果需要兼容整数与浮点数混合的场景(比如1-5或1.2-3),可以使用更通用的模式:

dfs['range'] = dfs.path.str.extract(r'(\d+(?:\.\d+)?-\d+(?:\.\d+)?)')

其中(?:\.\d+)?表示小数点及后续数字为可选内容,适配更多格式的数字范围。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 00:45:53