首页 > 解决方案 > 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只寻找一个*而不是**

标签: pythonregex

解决方案


您可以使用^[^*]*\*[^*]*$仅匹配一个星号的字符串。[^*]*匹配 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*")。

另一种选择可能^[^*]*\*$与我最初的建议相同,但仅在字符串末尾带有星号。


推荐阅读