Pandas 使用逻辑过滤串联的多个模式和多个子字符串 |和 "but not"
Pandas filtering for multiple patterns and multiple substrings in series using logic | and "but not"
我想使用 re
和 contain
:
由多个使用 |
的模式组成的模式,但我也想使用 "But not".
我想class确定工作类型。
#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个classes。
'Build a wall and add a new door'
得到 class 化为 class cons
和 class carp
。
但我希望 pattern_carp
的字符串为 False
。
是否可以使用排除 ?!buil
的模式。我的意思是这样的? :
`pattern_carp= 'shelving|table|door(?!buil'`
好吧,我找到了解决它的方法,虽然可能不是最优雅的方法。 你会如何改进它?,事实上,我正在丢失信息。
我添加了这个:
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
我想使用 re
和 contain
:
由多个使用 |
的模式组成的模式,但我也想使用 "But not".
我想class确定工作类型。
#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个classes。
'Build a wall and add a new door'
得到 class 化为 class cons
和 class carp
。
但我希望 pattern_carp
的字符串为 False
。
是否可以使用排除 ?!buil
的模式。我的意思是这样的? :
`pattern_carp= 'shelving|table|door(?!buil'`
好吧,我找到了解决它的方法,虽然可能不是最优雅的方法。 你会如何改进它?,事实上,我正在丢失信息。
我添加了这个:
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