我有一个数据框,其中一列包含网址。我想将它与字符串值列表进行比较,并在匹配的任何地方为新列添加数字。
该列看起来像这样:
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}
任何帮助将不胜感激,谢谢。
答案 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
的近似匹配。