Извлечение целых чисел после двойного пробела с помощью регулярного выражения - PullRequest
1 голос
/ 15 марта 2019

У меня есть датафрейм, где я хочу извлечь вещи после двойного пробела.Для всех строк в столбце NAME после названий компаний перед целыми числами стоит двойной пробел.

                                    NAME  INVESTMENT  PERCENT
0     APPLE COMPANY A  57 638 232 stocks     OIL LTD  0.12322
1  BANANA 1 COMPANY B  12 946 201 stocks    GOLD LTD  0.02768
2     ORANGE COMPANY C  8 354 229 stocks     GAS LTD  0.01786

df = pd.DataFrame({
    'NAME': ['APPLE COMPANY A  57 638 232 stocks', 'BANANA 1 COMPANY B  12 946 201 stocks', 'ORANGE COMPANY C  8 354 229 stocks'],
    'PERCENT': [0.12322, 0.02768 , 0.01786]
    })

У меня есть это ранее, но оно также включает целые числа в названии компании:

df['STOCKS']=df['NAME'].str.findall(r'\b\d+\b').apply(lambda x: ''.join(x))

Вместо этого я попытался извлечь после двойных пробелов

df['NAME'].str.split('(\s{2})')

, что дает вывод:

0       [APPLE COMPANY A,   , 57 638 232 stocks]
1    [BANANA 1 COMPANY B,   , 12 946 201 stocks]
2       [ORANGE COMPANY C,   , 8 354 229 stocks]

Однако я хочу, чтобы целые числа, которые встречаются после двойных пробелов, были соединены /объединить и поставить в новую колонку.

                 NAME  PERCENT  STOCKS
0     APPLE COMPANY A  0.12322  57638232
1  BANANA 1 COMPANY B  0.02768  12946201
2    ORANGE COMPANY C  0.01786  12946201

Как я могу изменить свою вторую функцию, чтобы делать то, что я хочу?

Ответы [ 5 ]

4 голосов
/ 15 марта 2019

Следуя исходной логике, вы можете использовать

df['STOCKS'] = df['NAME'].str.extract(r'\s{2,}(\d+(?:\s\d+)*)', expand=False).str.replace(r'\s+', '')
df['NAME'] = df['NAME'].str.replace(r'\s{2,}\d+(?:\s\d+)*\s+stocks', '')

Вывод:

                 NAME  PERCENT    STOCKS
0     APPLE COMPANY A  0.12322  57638232
1  BANANA 1 COMPANY B  0.02768  12946201
2    ORANGE COMPANY C  0.01786   8354229

Подробности

  • \s{2,}(\d+(?:\s\d+)*) isиспользуется для извлечения первого вхождения разделенных пробельными символами последовательных цифр после 2 или более пробелов и .replace(r'\s+', '') удаляет все пробелы в этом извлеченном тексте, а затем
  • .replace(r'\s{2,}\d+(?:\s\d+)*\s+stocks' обновляет текст в столбце NAME, этоудаляет 2 или более пробелов, последовательные разделенные пробелами куски цифр, а затем 1+ пробелов и stocks.На самом деле, последний \s+stocks может быть заменен на .*, если есть другие слова.
3 голосов
/ 15 марта 2019

Другой pandas подход, который приведёт STOCKS к числовому типу:

df_split = (df['NAME'].str.extractall('^(?P<NAME>.+)\s{2}(?P<STOCKS>[\d\s]+)')
            .reset_index(level=1, drop=True))

df_split['STOCKS'] = pd.to_numeric(df_split.STOCKS.str.replace('\D', ''))

Назначьте эти столбцы обратно в ваш исходный DataFrame:

df[['NAME', 'STOCKS']] = df_split[['NAME', 'STOCKS']]

         COMPANY_NAME    STOCKS  PERCENT
0     APPLE COMPANY A  57638232  0.12322
1  BANANA 1 COMPANY B  12946201  0.02768
2    ORANGE COMPANY C   8354229  0.01786
1 голос
/ 15 марта 2019

Вы можете использовать операторы оглядываться назад и заглядывать в будущее.

''.join(re.findall(r'(?<=\s{2})(.*)(?=stocks)',string)).replace(' ','')

Это ловит все символы между двумя пробелами и словом stock и заменяет все пробелы на ноль.

Другое решение с использованием Split

df["NAME"].apply(lambda x:x[x.find('  ')+2:x.find('stocks')-1].replace(' ',''))

Справка: -

  1. Look_behind
0 голосов
/ 15 марта 2019

Это можно сделать без использования регулярных выражений с помощью split.

df['STOCKS'] = df['NAME'].apply(lambda x: ''.join(x.split('  ')[1].split(' ')[:-1]))
df['NAME'] = df['NAME'].str.replace(r'\s?\d+(?:\s\d+).*', '')
0 голосов
/ 15 марта 2019

Вы можете попробовать

df['STOCKS'] = df['NAME'].str.split(',')[2].replace(' ', '')
df['NAME'] = df['NAME'].str.split(',')[0]
...