Сравнение списка со столбцом данных и создание нового столбца с числами - PullRequest
0 голосов
/ 13 мая 2018

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

Столбец выглядит примерно так:

source
www.fox5.com/some_article
www.nyt.com/some_article
www.fox40news.com/some_article
www.cnn.com/another_article
...

Я хочу сравнить его с этим списком:

sources = ['fox', 'yahoo', 'abcnews', 'google', 'cnn', 'nyt', 'nbc', 
'washingtonpost', 'wsj', 'huffingtonpost']

и если значение источника содержится в столбце источника, добавьте соответствующий номер расположения списка в новый столбец. Таким образом, полученный новый столбец будет выглядеть примерно так:

    sources                       sourcenum
www.fox5.com/some_article         1
www.nyt.com/some_article          6
www.fox40news.com/some_article    1
www.cnn.com/another_article       5
...                               ... 

Я пытался использовать цикл for со счетом:

count = 1
for x in sources:
    if x in df.source.values:
        df.sourcenum = count
    count += 1

но на выходе просто все 0

Я также пытался использовать numpys где, но он не принимает 10 аргументов.

Список можно изменить на словарь, например, если это будет работать лучше

sources = {'fox':1, 'yahoo':2, 'abcnews':3, 'google':4, 'cnn':5, 'nyt':6, 
       'nbc':7, 'washingtonpost':8, 'wsj':9, 'huffingtonpost':10}

Любая помощь будет оценена, спасибо.

Ответы [ 3 ]

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

Похоже, что регулярное выражение может помочь решить проблему.В Python есть модуль 're', хотя я не являюсь экспертом в Python.

Но идея состоит в том, чтобы создать «шаблон» с вашим списком источников и сопоставить этот шаблон со строками.Я считаю, что вы можете получить количество совпадений, которое вам нужно.

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

Вы также можете использовать пакет tldextract для получения доменного имени URL.

Затем примените функцию get_close_matches из difflib пакет для получения ближайшей строки.

И, наконец, используйте .index, чтобы получить соответствующий порядковый номер из списка источников:

import tldextract
from difflib import get_close_matches
df['sourcenum'] = df['source'].apply(lambda row:sources.index(
                                get_close_matches(
                                tldextract.extract(row).domain, sources, cutoff=.5)[0])+1)
print(df)

Результат:

                           source  sourcenum
0       www.fox5.com/some_article          1
1        www.nyt.com/some_article          6
2  www.fox40news.com/some_article          1
3     www.cnn.com/another_article          5

Примечание: в коде выше, для функции get_close_matches было установлено значение для cutoff=.5, в противном случае близкое совпадение для fox40news не найдено.

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

Одним из способов является использование выражения генератора с enumerate. В приведенной ниже реализации мы перебираем перечисляемый список sources. next извлекает первый экземпляр частичного совпадения. Если частичного совпадения не существует, возвращается 0.

sources = ['fox', 'yahoo', 'abcnews', 'google', 'cnn', 'nyt', 'nbc', 
           'washingtonpost', 'wsj', 'huffingtonpost']

def sourcer(x):
    return next((i for i, j in enumerate(sources, 1) if j in x), 0)

df['sourcenum'] = df['source'].apply(sourcer)

print(df)

                           source  sourcenum
0       www.fox5.com/some_article          1
1        www.nyt.com/some_article          6
2  www.fox40news.com/some_article          1
3     www.cnn.com/another_article          5
...