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

