Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Python在数据帧中查找后跟数字的特定单词_Python_Regex_Pandas - Fatal编程技术网

如何使用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:我希望整个票证号都在一个新的数据框列中。