Python 将列表与dataframe列进行比较,并使用数字创建新列
我有一个数据框,其中一列包含URL。我想将其与字符串值列表进行比较,并在它们匹配的地方向新列添加一个数字 该列如下所示: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
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