Python Pandas:将行附加到已经通过Pandas.DataFrame.apply运行的数据帧
简介: 我正在使用Python2.7的Python Pandas:将行附加到已经通过Pandas.DataFrame.apply运行的数据帧,python,selenium,pandas,Python,Selenium,Pandas,简介: 我正在使用Python2.7的Selenium WebDriver和Pandas来制作一个web刮板,它可以指向一系列URL并刮板该页面上的URL。如果它在那里找到URL,我希望它们被添加到运行序列中。如何使用pandas.DataFrame.apply 代码: 上面的刮板使用电子表格.csv中的列“URL”导航到每个新的URL。 然后,它在页面上刮取与regexwww.+匹配的所有字符串以查找URL,并将结果放入列表刮取的URL 它还获取字符串something\u else=“fo
Selenium WebDriver
和Pandas
来制作一个web刮板,它可以指向一系列URL并刮板该页面上的URL。如果它在那里找到URL,我希望它们被添加到运行序列中。如何使用pandas.DataFrame.apply
代码: 上面的刮板使用
电子表格.csv中的列“URL”
导航到每个新的URL
。
然后,它在页面上刮取与regexwww.+
匹配的所有字符串以查找URL,并将结果放入列表刮取的URL
它还获取字符串something\u else=“foobar”
当它处理完“URL”
中的所有单元格后,它会写入一个新文件result.csv
我的问题:
我很难找到一种方法将列表中的刮取URL添加到列“URL”
——这样它们就插入到“活动”URL的正下方(使用use[“URL”]
检索)
如果源电子表格中的列如下所示:
["URL"]
"www.yahoo.com"
"www.altavista.com"
"www.geocities.com"
在www.yahoo.com上,scraper通过regex找到这些字符串:
"www.angelfire.com"
"www.gamespy.com"
我想将这些作为行添加到www.yahoo.com
下面的列“URL”
,以便它们成为刮板搜索的下一个关键字:
["URL"]
"www.yahoo.com" #This one is done
"www.angelfire.com" #Go here now
"www.gamespy.com" #Then here
"www.altavista.com" #Then here
"www.geocities.com" #...
这可能吗?我是否可以在运行中附加数据帧df
,该数据帧已经通过apply()
运行了?我认为没有办法按照您的设想使用apply
。即使有办法
- 这很可能需要跟踪已经迭代了多少项
这样您就可以知道在哪里将新项目插入
df['URL']
- 在
df['URL']
中间插入需要将当前数据帧中的所有数据复制到
新的、更大的数据帧。将整个数据帧(可能)复制一次
每行代码都会使代码变得不必要的慢
相反,一种更简单、更好的方法是使用。堆栈可以通过一个简单的列表来实现。您可以将df['URL']
推到堆栈上,然后从堆栈中弹出一个URL并对其进行处理。当发现新的刮取URL时,可以将其推送到堆栈上,并成为下一个弹出的项目:
import pandas as pd
def crawl(url_stack):
url_stack = list(url_stack)
result = []
while url_stack:
url = url_stack.pop()
driver.get(url)
scraped_urls = ...
url_stack.extend(scraped_urls)
something_else = "foobar"
result.append([url, something_else])
return pd.DataFrame(result, columns=["URL", "Something else"])
df = pd.read_csv(spreadsheet.csv, delimiter=",")
df = crawl(df['URL'][::-1])
df.to_csv("result.csv", delimiter=",")
import pandas as pd
def crawl(url_stack):
url_stack = list(url_stack)
result = []
while url_stack:
url = url_stack.pop()
driver.get(url)
scraped_urls = ...
url_stack.extend(scraped_urls)
something_else = "foobar"
result.append([url, something_else])
return pd.DataFrame(result, columns=["URL", "Something else"])
df = pd.read_csv(spreadsheet.csv, delimiter=",")
df = crawl(df['URL'][::-1])
df.to_csv("result.csv", delimiter=",")