【问题标题】:Search for keywords in text and create a data frame column per found keyword?在文本中搜索关键字并为每个找到的关键字创建一个数据框列?
【发布时间】:2017-07-27 12:07:21
【问题描述】:

我正在一些网页中搜索关键字。再次感谢@Abdou 帮助我处理silent error handling!我给你举个例子:

# this is basically what I do
import pandas as pd
import requests


data = [{"URLs" : "https://www.mercedes-benz.de", "electric" : 1},
        {"URLs" : "https://www.audi.de", "electric" : 0}, 
        {"URLs" : "https://ww.audo.de", "electric" : 0}, 
        {"URLs" : "NaN", "electric" : 0}]


def contains_keywords(link, keywords):
    try:
        output = requests.get(link).text
        return int(any(x in output for x in keywords))
    except:
        return "Wrong/Missing URL"


df = pd.DataFrame(data)
mykeywords = ('car', 'vehicle', 'automobile')
df['extra_column'] = df.URLs.apply(lambda l: contains_keywords(l, mykeywords))

如您所见,我请求存储在df.data 中的URL,并从mykeywords 中搜索关键字并将二进制结果存储在extra_column 中。该脚本基本上产生以下内容:

#                            URLs  electric       extra_column
# 0  https://www.mercedes-benz.de         1                  1
# 1           https://www.audi.de         0                  1
# 2             https://ww.audo.e         0                  0
# 3                           NaN         0  Wrong/Missing URL

到目前为止,我只知道,如果我找到一个关键字。但我想知道我找到了哪些关键字——无需为mykeywords 中的每个关键字单独运行contains_keywords()。有没有办法为每个关键字创建一个新列并将结果(1 = 找到关键字)存储在DataFrame 中?即:我需要在df 中为每个关键字添加额外的列。

【问题讨论】:

  • “我想知道,我找到了哪些关键字...”表示您需要在df 中为 each 关键字添加额外的列?
  • 嗨,Dmitriy,这正是我想要的!每个关键字对应一列。那可能吗?我尝试了我所知道的一切,但到目前为止我还没有锻炼出来。抱歉,我的问题不清楚。我会相应地编辑它。

标签: python-3.x pandas web-scraping


【解决方案1】:
import pandas as pd
import requests


data = [{"URLs" : "https://www.mercedes-benz.de", "electric" : 1},
        {"URLs" : "https://www.audi.de", "electric" : 0}, 
        {"URLs" : "https://ww.audo.de", "electric" : 0}, 
        {"URLs" : "NaN", "electric" : 0}]


def contains_keywords(link, keyword):
    try:
        output = requests.get(link).text
        return int(keyword in output)
    except:
        return "Wrong/Missing URL"


df = pd.DataFrame(data)
mykeywords = ('car', 'vehicle', 'automobile')
for keyword in mykeywords:
    df[keyword] = df.URLs.apply(lambda l: contains_keywords(l, keyword))

【讨论】:

  • 哇!这太酷了!我只是不明白怎么回事。看来您可以直接将keyword 称为df.column?超酷!谢谢!
  • 嗨@Dmitriy Fialkovskiy,最后一个简短的问题:我知道鉴于forloop,我为mykeywords 中的每个keyword 应用containains_keywords 函数。所以在这种情况下,3次。这是否也意味着一次搜索int(any(x in output for x in keywords))所需的时间是搜索时间的3倍?
  • 嗨,Rachel,在我的代码版本中,没有 any 函数,它一次只检查一个关键字。
  • 嗨,是的,这就是需要的东西!但在我最初的问题中,我使用了any 函数。让我这样说吧:如果我在mykeywords 中有2 关键字,与在mykeywords 中有1 关键字相比,它需要两倍的时间吗?
  • 这是一个非常深奥的问题,我其实不知道。但是您可以使用大量关键字进行实验,并在两种情况下手动测量执行时间=)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-06
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多