从 Pandas df 中提取某些单词,不区分大小写,后跟数字

问题描述 投票:0回答:1

您可以从数据框中的不良自由格式数据中提取一系列字母和数字吗?

我想在数据框中创建一个新列,其中的数据包含“NEX”及其后面的一系列数字。

import pandas as pd

#Create a Dataframe
data = {
    'ID':[1,2,3,4,5],
    'PROGRAM': [ 'nbu 123456',
                'NBU-123456',
                'nex999999 b12',
                'NXE999999 123',
                'NBU123456 NEX999999']
}

df = pd.DataFrame(data)

我认为我与下面的内容是正确的,但我以某种方式需要结合它们的功能:-

print(df['PROGRAM'].str.contains('NEX', na=False))
# does not deal with lower case & contains letters NEX not nessary in that order
print(df['PROGRAM'].str.extract(r'([NEX]+\d+)', expand=False))

结果应该只会返回NEX999999(包括将小写转换为大写)

df['NEX'] = df['PROGRAM'].str.blahblahblah
python pandas dataframe
1个回答
0
投票

您不需要使用

NEX
预过滤行,您的正则表达式已经可以做到这一点。

您的正则表达式的一个问题是

[NEX]
,这允许 N/E/X 集中的单个字符,这不是您想要的。
[NEX]+
将匹配
N
EEEN

您应该使用:

df['out'] = df['PROGRAM'].str.upper().str.extract(r'(NEX\d+)', expand=False)

如果您不关心小写/大写:

import re

df['out2'] = df['PROGRAM'].str.extract(r'(NEX\d+)', expand=False, flags=re.I)

如果您只想要数字:

df['out3'] = df['PROGRAM'].str.extract(r'NEX(\d+)', expand=False, flags=re.I)

输出:

   ID              PROGRAM        out       out2    out3
0   1           nbu 123456        NaN        NaN     NaN
1   2           NBU-123456        NaN        NaN     NaN
2   3        nex999999 b12  NEX999999  nex999999  999999
3   4        NXE999999 123        NaN        NaN     NaN
4   5  NBU123456 NEX999999  NEX999999  NEX999999  999999
© www.soinside.com 2019 - 2024. All rights reserved.