Python: Как отфильтровать столбцы с включенным символом, но без нескольких символов - PullRequest
1 голос
/ 27 мая 2020

У меня есть фрейм данных с именами столбцов, которые включают * или **, как показано ниже.

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 искать только один *, а не **?

1 Ответ

0 голосов
/ 27 мая 2020

Вы можете использовать ^[^*]*\*[^*]*$ для сопоставления строк с одной звездочкой. [^*]* соответствует 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*").

Другой вариант может быть ^[^*]*\*$, что совпадает с моим исходным предложением, но со звездочкой только в конце строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...