Python 将列表与dataframe列进行比较,并使用数字创建新列

Python 将列表与dataframe列进行比较,并使用数字创建新列,python,string,list,pandas,series,Python,String,List,Pandas,Series,我有一个数据框,其中一列包含URL。我想将其与字符串值列表进行比较,并在它们匹配的地方向新列添加一个数字 该列如下所示: source www.fox5.com/some_article www.nyt.com/some_article www.fox40news.com/some_article www.cnn.com/another_article ... sources sourcenum www.fox5.com/some_artic

我有一个数据框,其中一列包含URL。我想将其与字符串值列表进行比较,并在它们匹配的地方向新列添加一个数字

该列如下所示:

source
www.fox5.com/some_article
www.nyt.com/some_article
www.fox40news.com/some_article
www.cnn.com/another_article
...
    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
...                               ... 
我想将其与以下列表进行比较:

sources = ['fox', 'yahoo', 'abcnews', 'google', 'cnn', 'nyt', 'nbc', 
'washingtonpost', 'wsj', 'huffingtonpost']
如果sources值包含在source列中,则将列表位置的相应编号添加到新列中。因此,生成的新列将如下所示:

source
www.fox5.com/some_article
www.nyt.com/some_article
www.fox40news.com/some_article
www.cnn.com/another_article
...
    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}

任何帮助都将不胜感激,谢谢

一种方法是将生成器表达式与
枚举一起使用。在下面的实现中,我们循环遍历枚举的
列表<代码>下一步
提取部分匹配的第一个实例。如果不存在部分匹配,则返回
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

看起来正则表达式可以帮助解决这个问题。Python有“re”模块,尽管我不是Python专家


但是想法是用你的源列表组成一个“模式”,并将该模式与字符串相匹配。我相信你可以得到你需要的匹配数。

你也可以使用
tldextract
包获得url的域名

然后,从中应用
get\u close\u 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\u close\u matches
设置了
cutoff=.5
的值,否则找不到
fox40news
的close match