python - Python:如何过滤包含一个字符但不包含多个字符的列
问题描述
我有一个数据框,其列名包含*
or **
,如下所示。
data = [['Tom', 'M', 10], ['Nick', 'M', 15], ['Ann', 'F', 14]]
df = pd.DataFrame(data, columns = ['Name*', 'Gender**', 'Age'])
我只想过滤有一个*
但没有两个的列**
(所以Name*
在这种情况下只剩下)。但如果我使用df.filter(regex="\*")
,它会同时保留Name*
和Gender**
。我如何告诉regex
只寻找一个*
而不是**
?
解决方案
您可以使用^[^*]*\*[^*]*$
仅匹配一个星号的字符串。[^*]*
匹配 0 个或多个不是*
文字的字符,后跟一个*
文字,再跟一个[^*]*
,锚定在两端。
>>> data = [['Tom', 'M', 10], ['Nick', 'M', 15], ['Ann', 'F', 14]]
>>> df = pd.DataFrame(data, columns=['Name*', 'Gender**', 'Age'])
>>> df
Name* Gender** Age
0 Tom M 10
1 Nick M 15
2 Ann F 14
>>> df.filter(regex=r"^[^*]*\*[^*]*$")
Name*
0 Tom
1 Nick
2 Ann
虽然这是对您的请求的非常字面解释,但\w\*$
对于您的用例可能非常准确,正如尼克在评论中指出的那样(尽管被警告,它会匹配类似的内容"*foo*"
)。
另一种选择可能^[^*]*\*$
与我最初的建议相同,但仅在字符串末尾带有星号。