您可以从数据框中的不良自由格式数据中提取一系列字母和数字吗?
我想在数据框中创建一个新列,其中的数据包含“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
您不需要使用
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