繁体   English   中英

在 Pandas 中使用拆分正则表达式从完整路径中提取文件名中的整数

[英]Extract integer in a filename from complete path using split regex in Pandas

给定一个df

df=pd.DataFrame(['/home/dtest/Documents/user/exp/S1/test1/test3/sub5/file_2_F__131147.png',
                 '/home/dtest/Documents/user/exp/S1/test1/test3/sub5/file_2_F__160565.png'])

我只想提取文件扩展名之前的整数。

下面的代码应该回答上述目标

df['fname'] =df[0].apply(lambda x : os.path.split(x)[1])
df['f'] =df['fname'].apply(lambda x : x.split('__')[1].split('.png')[0])
df['f']=df['f'].astype(int)

但是,我觉得这可以使用 pandas 内置split轻松实现,如下所示

df['f']=df[0].str.split(re.compile(r"__\d.jpg"), expand=True)

但是,似乎什么都没有被分割。 我可以知道哪些参数设置不正确吗?

您可以使用Series.str.extract

df['num'] = df['f'].str.extract(r'_(\d+)\.[^.]+$', expand=False)

在这里测试你的正则表达式

详情

  • _ - 下划线
  • (\d+) - 捕获组 1(这是Series.str.extract返回的值):一位或多位数字
  • \. - 一个. 字符
  • [^.]+ - 除了 a 之外的一个或多个字符. 字符
  • $ - 字符串结尾

蟒蛇测试:

import pandas as pd
df = pd.DataFrame({'f':['/home/dtest/Documents/user/exp/S1/test1/test3/sub5/file_2_F__131147.png',
    '/home/dtest/Documents/user/exp/S1/test1/test3/sub5/file_2_F__160565.png']})
df['num'] = df['f'].str.extract(r'_(\d+)\.[^.]+$', expand=False)
print(df.to_string())

输出:

                                                                         f     num
0  /home/dtest/Documents/user/exp/S1/test1/test3/sub5/file_2_F__131147.png  131147
1  /home/dtest/Documents/user/exp/S1/test1/test3/sub5/file_2_F__160565.png  160565

假设0列的名称(如在您的示例中),您可以使用str.extract

df[0].str.extract(r'(\d+)\.[^.]+$', expand=False)

输出:

0    131147
1    160565
Name: 0, dtype: object

要分配给新列:

df['f'] = df[0].str.extract(r'(\d+)\.[^.]+$')

正则表达式演示

def extract(values):
    values = values.split('__') # cut at '__'
    return int(values[-1].replace('.png','')) # take the last part en replace the .png

df[0].apply(extract)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM