我正在尝试根据字符串值删除包含字符串的行。为此,我正在寻找字符串中的特定子字符串。我的问题来自于这些子字符串包含空格,这似乎是我当前的过滤器没有考虑空格。
# List of substring to remove
searchfor = ['Value ', 'VALUE ', 'Value.', 'VALUE.']
# keeping only the rows with the substrings
df[df["""column"""].str.contains('|'.join(searchfor))]
但是,我仍然检索一些包含以下值的行: “XX值XXXXXX”
我相信空间应该删除那些但显然没有。
您的过滤器无法按预期工作的原因是,
str.contains()
方法认为字符串包含所需的子字符串,无论 sbustring 在大字符串中的位置如何。
要让过滤器仅考虑以搜索列表中的值开头的子字符串,您可以使用参数修改过滤器并使用
^
符号来指示字符串的开头
filtered_df=df[df["column"].str.contains('|'.join(searchfor), regex=True)]
空间没有问题。问题是点(
.
)是正则表达式中的特殊字符,用于匹配任何字符。如果您想要字面匹配,请使用 \
转义字符:
searchfor = ['Value ', 'VALUE ', 'Value\.', 'VALUE\.'] # dots escaped
例如:
import pandas as pd
df = pd.DataFrame({'column': ['XXVALUEXXXXXX',
'XXVALUE.XXXXXX',
'XXValue XXXXXX']})
df
column
0 XXVALUEXXXXXX # will no longer be matched
1 XXVALUE.XXXXXX
2 XXValue XXXXXX
searchfor = ['Value ', 'VALUE ', 'Value\.', 'VALUE\.']
df[df['column'].str.contains('|'.join(searchfor))]
column
1 XXVALUE.XXXXXX
2 XXValue XXXXXX
re.escape
:
import re
searchfor = ['Value ', 'VALUE ', 'Value.', 'VALUE.']
escaped_searchfor = '|'.join([re.escape(elem) for elem in searchfor])
df[df['column'].str.contains(escaped_searchfor)]
column
1 XXVALUE.XXXXXX
2 XXValue XXXXXX