Найти строки с заглавными буквами и заканчиваться определенным словом в регулярном выражении - PullRequest
1 голос
/ 20 марта 2019

У меня есть фрейм данных, в котором один столбец состоит из строк, которые имеют три шаблона:

1) Только заглавные буквы: APPLE COMPANY

2) Заглавные буквы и заканчиваются буквами AS: CAR COMPANY AS

3) Прописные и строчные буквы: John Smith

df = pd.DataFrame({'NAME': ['APPLE COMPANY', 'CAR COMPANY AS', 'John Smith']})

             NAME ...
0   APPLE COMPANY ...
1  CAR COMPANY AS ...
2      John Smith ...
3             ... ...

Как я могу вынуть те строки, которые не отвечают условиям 2) и 3), т.е. 1)? Другими словами, как я могу извлечь строки, которые имеют только заглавные буквы, не заканчиваются на AS или содержат в строке как верхние, так и нижние буквы?

Я придумал это:

df['NAME'].str.findall(r"(^[A-Z ':]+$)")
df['NAME'].str.findall('AS')

Первый извлекает строки только с верхними буквами, а второй находит только AS. Если есть другие методы, кроме regex, я тоже буду рад попробовать.

Ожидаемый результат:

             NAME ...
1  CAR COMPANY AS ...
2      John Smith ...
3             ... ...

Ответы [ 4 ]

3 голосов
/ 20 марта 2019

в одну сторону было бы,

df['temp']=df['NAME'].str.extract("(^[A-Z ':]+$)")
s1=df['temp']==df["NAME"]
s2=~df['NAME'].str.endswith('AS')

print(df.loc[~(s1&s2), 'NAME'])

O / P:

1    CAR COMPANY AS
2        John Smith
Name: NAME, dtype: object
2 голосов
/ 20 марта 2019

Это регулярное выражение должно работать:

^(?:[A-Z ':]+ AS|.*[a-z].*)$

Соответствует одному из следующих:

  • [A-Z ':]+ AS - регистр всех заглавных букв, за которыми следует AS
  • .*[a-z].* - регистр строчных букв

Демо

1 голос
/ 20 марта 2019

Также вы можете попробовать:

df_new = df[~df['NAME'].str.isupper()|df['NAME'].str.endswith('AS')]
1 голос
/ 20 марта 2019

Используя apply и различные шаблоны, которые вы можете захотеть проверить:

import re
def myfilter(x):
    patterns = ['[A-Z]*AS$','[A-Z][a-z]{1,}']
    for p in patterns:
        if len(re.findall(p, x.NAME)):
            return True
    return False

selector = df.apply(myfilter, axis=1)

filtered_df = df[selector]

...