Панда фильтрации по нескольким шаблонам и нескольким подстрокам в серии с использованием логики | и "но не" - PullRequest
1 голос
/ 09 апреля 2019

Я хочу использовать re и contain: шаблон, который сформирован из нескольких шаблонов с использованием |, но я также хотел бы использовать «но не».

Я хочу классифицировать типыРабота.

#Data:
v=pd.Series(['New wiring system for an extra room','Build a wall and add a new door',
    'Fix a shelving unit'])
v=v.str.lower()
print(v)
#I construct this pattern:

pattern_cons='ret|wall|ceiling|buil|holes|cons'
pattern_nrg= 'wiring|media|elect'
pattern_plumb='water'
pattern_carp= 'shelving|table|door'

pattern_work=pd.Series([pattern_cons,pattern_nrg,pattern_plumb,
                       pattern_carp])

# Use this code : (I loop this)
for x in range(4):
    pattern=pattern_work
    vector={'pattern': pattern_work[x],'type_work':class_str[x]}   
    print(vector)
    s=v.str.contains(vector['pattern'], flags=re.IGNORECASE, regex=True)
    print(s)

Я получаю этот вывод:

0    new wiring system for an extra room
1        build a wall and add a new door
2                    fix a shelving unit
dtype: object
{'pattern': 'ret|wall|ceiling|buil|holes|cons', 'type_work': 'cons'}
0    False
1     True
2    False
dtype: bool
{'pattern': 'wiring|media|elect', 'type_work': 'nrg'}
0     True
1    False
2    False
dtype: bool
{'pattern': 'water', 'type_work': 'plumb'}
0    False
1    False
2    False
dtype: bool
{'pattern': 'shelving|table|door', 'type_work': 'carp'}
0    False
1     True  # ------- **** I WANT THIS  "False" **** ------- #
2     True
dtype: bool

Проблема в том, что последняя строка назначается 2 классам.

'Build a wall and add a new door' классифицируется как класс cons и как класс carp.

Но я хочу, чтобы строка была False для pattern_carp.

Можно ли использовать шаблон, исключающий ?!buil.Я имею в виду что-то вроде этого?:

`pattern_carp= 'shelving|table|door(?!buil'`

1 Ответ

0 голосов
/ 09 апреля 2019

Ну, я нашел способ ее решить, хотя, возможно, не самый элегантный. Как бы вы улучшили это? , на самом деле, я теряю информацию.

Я добавил это:

v=v.replace**("Build a wall and add a new door", "Build a wall and add a new")

Итак, код теперь:

v=pd.Series(['New wiring system for an extra room','Build a wall and add a new door',
    'Fix a shelving unit'])
v=v.replace("Build a wall and add a new door", "Build a wall and add a new")
print(v.replace("Build a wall and add a new door", "Build a wall and add a new"))
v=v.str.lower()
print(v)

pattern_cons='ret|wall|ceiling|buil|holes|cons'
pattern_nrg= 'wiring|media|elect'
pattern_plumb='water'
pattern_carp= 'shelving|table|door'
pattern_work=pd.Series([pattern_cons,pattern_nrg,
pattern_plumb, pattern_carp])

# Use this code : (I loop this)
for x in range(4):
    pattern=pattern_work
    vector={'pattern': pattern_work[x],'type_work':class_str[x]}   
    print(vector)
    s=v.str.contains(vector['pattern'], flags=re.IGNORECASE, regex=True)
    print(s)

Теперь я получаю правильный ответ (тот, который я хотел):

0    New wiring system for an extra room
1             Build a wall and add a new
2                    Fix a shelving unit
dtype: object
0    new wiring system for an extra room
1             build a wall and add a new
2                    fix a shelving unit
dtype: object
{'pattern': 'ret|wall|ceiling|buil|holes|cons', 'type_work': 'cons'}
0    False
1     True
2    False
dtype: bool
{'pattern': 'wiring|media|elect', 'type_work': 'nrg'}
0     True
1    False
2    False
dtype: bool
{'pattern': 'water', 'type_work': 'plumb'}
0    False
1    False
2    False
dtype: bool
{'pattern': 'shelving|table|door', 'type_work': 'carp'}
0    False
1    False
2     True
dtype: bool
...