Как найти совпадения строк в кадре данных с помощью Python - PullRequest
1 голос
/ 13 мая 2019

Я пытаюсь найти близкие совпадения между строкой текста и двумя столбцами моего фрейма данных - «тикеры» и / или «компания».

Это пример фрейма данных:

cik     | tickers | company                      |
--------------------------------------------------
1090872 | A       |   Agilent Technologies Inc   |
--------------------------------------------------
4281    | AA      |   Alcoa Inc                  |
--------------------------------------------------
6201    | AAL     |   American Airlines Group Inc|
--------------------------------------------------
8177    | AAME    |   Atlantic American Corp     |
--------------------------------------------------
706688  | AAN     |   Aarons Inc                 |
--------------------------------------------------
320193  | AAPL    |   Apple Inc                  |
--------------------------------------------------

И вот как может выглядеть какой-то текст:

text = 'consectetur elementum Apple Inc Agilent Inc. Aenean porttitor porta magna AA American Airlines AAMC Aarons Inc AAPL e plumbs ernum. AA'

Я хотел бы найти все близкие совпаденияв этом тексте и сделайте вывод примерно таким:

The following companies were found in 'text':
- AAPL: Apple Inc
- A: Agilent Technologies Inc
- AA: American Airlines Group Inc
- AAN: Aarons Inc

Вот код, который у меня есть до сих пор, но он неполон, и я понимаю, что ему нужен другой подход:

import pandas as pd
import re

data = {'cik': ['1090872', '4281', '6201', '8177', '706688', '320193'], 'ticker': ['A', 'AA', 'AAL', 'AAME', 'AAN', 'AAPL'], 'company': ['Agilent Technologies Inc', 'Alcoa Inc', 'American Airlines Group Inc', 'Atlantic American Corp', 'Aarons Inc', 'Apple Inc']}
df = pd.DataFrame(data, columns=['cik', 'ticker', 'company'])

text = 'consectetur elementum Apple Inc Agilent Inc. Aenean porttitor porta magna AA American Airlines AAMC Aarons Inc AAPL e plumbs ernum. AA'

ticker = df['ticker']
regex = re.compile(r"\b(?:" + "|".join(map(re.escape, ticker)) + r")\b")

matches = re.findall(regex, text)
for match in matches:
    print(match)

1 Ответ

0 голосов
/ 13 мая 2019

Вот как бы я занялся этим. Прежде всего, настроить на основе вашего кода

import pandas as pd
import numpy as np
data = [['1090872', 'A', 'Agilent Technologies Inc'], ['4281', 'AA', 'Alcoa Inc'],
       ['6201', 'AAL', 'American Airlines Group Inc'], ['8177', 'AAME', 'Atlantic American Corp'],
       ['706688', 'AAN', 'Aarons Inc'], ['320193', 'AAPL', 'Apple Inc']]
df = pd.DataFrame(data, columns=['cik', 'tickers', 'company'])
text = "consectetur elementum Apple Inc Agilent Inc. Aenean porttitor porta magna AA American \
Airlines AAMC Aarons Inc AAPL e plumbs ernum. AA"
df['text'] = text
df['found'] = None

company_values = df['company'].values
for val in company_values:
    row = df.loc[df['company'] == val]
    if row['text'].str.contains(val).any():
        df.loc[df['company'] == val, 'found'] = 'Yes'
# filter the results        
df.loc[df['found'] == 'Yes']

Я думаю, сделать текстовую часть кадра данных и затем найти, какая из компаний на самом деле найдена, и затем записать это в столбце df['found'], который затем можно отфильтровать, чтобы найти список компаний. Здесь я делаю предположение, что в фрейме данных содержатся только уникальные названия компаний и их тикеры.

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