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

时间:2018-05-13 18:27:24

标签: python string list pandas series

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

该列看起来像这样:

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']

并且source列中包含sources值的位置将列表位置的相应编号添加到新列。因此得到的新列看起来像这样:

    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 :(得分:1)

一种方法是使用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

答案 1 :(得分:0)

看起来正则表达式可以帮助解决问题。 Python有''模块,虽然我不是Python的专家。

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

答案 2 :(得分:0)

您还可以使用tldextract包获取网址的域名。

然后,应用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的近似匹配。