如何使用Python在数据帧中查找后跟数字的特定单词
我有一个包含一系列模式的数据框架 数据帧示例:如何使用Python在数据帧中查找后跟数字的特定单词,python,regex,pandas,Python,Regex,Pandas,我有一个包含一系列模式的数据框架 数据帧示例: mydata: [ 'Ticket number INS 00909', 'Ticket number INS00909', 'Ticket number REQ 8776', 'Ticket number REQ#8777', 'Ticket number REQ #8778', 'Ticket number REQ8778', 'Number is CR 0098445554', 'No INS number', 'No REQUEST',
mydata:
[ 'Ticket number INS 00909',
'Ticket number INS00909',
'Ticket number REQ 8776',
'Ticket number REQ#8777',
'Ticket number REQ #8778',
'Ticket number REQ8778',
'Number is CR 0098445554',
'No INS number',
'No REQUEST',
'DESCRIBED']
Search_Values = ['INS', 'REQ', 'CR' ]
pattern = '|'.join(Search_Values)
df['check'] = df['mydata'].str.contains(pattern)
基本上,我只想找到并提取车票号码。应该应用什么逻辑来拉取CR、REQ、INS和数字?有时字符串在Req和number之间包含特殊字符,如#、-、:、*、空格(\s)。有人能帮忙吗?如果您不必区分INS、
RES
和CR
数字,您可以使用以下代码:
import re
data = [ 'Ticket number INS 00909',
'Ticket number INS00909',
'Ticket number REQ 8776',
'Ticket number REQ#8777',
'Ticket number REQ #8778',
'Ticket number REQ8778',
'Number is CR 0098445554',
'No INS number',
'No REQUEST',
'DESCRIBED']
numbers = []
for item in data:
res = re.findall(r'[0-9]+$', item)
if res != []:
numbers.append(res[0])
print(numbers)
它给出了一个简单的列表,其中包含所有票号:
['00909', '00909', '8776', '8777', '8778', '8778', '0098445554']
否则,如果需要区分票证类型,请使用以下选项:
import re
data = [ 'Ticket number INS 00909',
'Ticket number INS00909',
'Ticket number REQ 8776',
'Ticket number REQ#8777',
'Ticket number REQ #8778',
'Ticket number REQ8778',
'Number is CR 0098445554',
'No INS number',
'No REQUEST',
'DESCRIBED']
numbers = {'INS': [], 'REQ': [], 'CR': []}
for item in data:
res = re.findall(r'[0-9]+$', item)
if res != []:
if 'INS' in item:
numbers['INS'].append(res[0])
elif 'REQ' in item:
numbers['REQ'].append(res[0])
elif 'CR' in item:
numbers['CR'].append(res[0])
print(numbers)
它为每种票证类型提供了一个带有密钥的字典:
{'INS': ['00909', '00909'], 'REQ': ['8776', '8777', '8778', '8778'], 'CR': ['0098445554']}
我将票号保留为
str
,我没有将它们转换为int
,以避免这种可能不需要的转换:'00909'-->909
此解决方案基于票证号码始终位于字符串末尾的假设。这将为您提供一个新的df列。mydata字符串的索引用于仅获取所需信息的切片。最后一个if/else块检查字符串中是否有数字,以避免附加假阳性匹配
order_list = []
for idx, row in df.iterrows():
if 'INS' in row['mydata']:
index = row['mydata'].index('INS')
elif 'REQ' in row['mydata']:
index = row['mydata'].index('REQ')
elif 'CR' in row['mydata']:
index = row['mydata'].index('CR')
if any(map(str.isdigit, row['mydata'])):
order_list.append(row['mydata'][index:])
else:
order_list.append('')
df['order'] = order_list
print(df)
mydata order
0 Ticket number INS 00909 INS 00909
1 Ticket number INS00909 INS00909
2 Ticket number REQ 8776 REQ 8776
3 Ticket number REQ#8777 REQ#8777
4 Ticket number REQ #8778 REQ #8778
5 Ticket number REQ8778 REQ8778
6 Number is CR 0098445554 CR 0098445554
7 No INS number
8 No REQUEST
9 DESCRIBED
你想要的输出是什么?所有数字的列表?作为
{'type of ticket':票号列表}
的字典?一个带有字符串的新数据框列“票证类型-票证号”
?@Andrea Blengino:我希望整个票证号都在一个新的数据框列中。