我有兴趣从网站中提取一些表,我定义了表所在的链接的列表。每个链接都有几张具有相同列数的表。因此,我使用pandas read_html()函数将链接列表中的所有表提取到一个表中,如下所示:
links = ['url1.com','url2.com',...,'urlN.com']
import multiprocessing
def process_url(link):
return pd.concat(pd.read_html(link), ignore_index=False) # add in a new column the link where the table was extracted..
p = multiprocessing.Pool()
df = pd.concat(p.map(process, links), ignore_index=True)
我注意到执行每个表的出处链接将很有帮助(即,将新表中的最终链接保存到新列中)。因此,我的问题是,如何在新列中进行熊猫read_html()参考链接?
例如:
表1和2在url1.com中:
表格1:
fruit, color, season, price
apple, red, winter, 2$
watermelon, green, winter, 3$
orange, orange, spring, 1$
表2:
fruit, color, season, price
peppermint, green, fall, 3$
pear, yellow, fall, 4$
表3位于url2.com中
fruit, color, season, price
tomato, red, fall, 3$
pumpking, orange, fall, 1$
我想将提取每个表的位置保存在新列中(即在新列中进行表的引用):
fruit, color, season, price, link
0 apple, red, winter, 2$, url1.com
1 watermelon, green, winter, 3$, url1.com
2 orange, orange, spring, 1$, url1.com
3 peppermint, green, fall, 3$, url1.com
4 pear, yellow, fall, 4$, url1.com
5 tomato, red, fall, 3$, url2.com
6 pumpking, orange, fall, 1$, url2.com
另一个示例是此“关系图”,请注意table1和table2在url1.com中。另一方面,表3在url2.com中。使用上面的功能,我从位于不同链接中的表中创建了一个表,我的目标是创建一个与表提取位置一致的列(只是保存引用):
source: url1.com
fruit, color, season, price
apple, red, winter, 2$
watermelon, green, winter, 3$
orange, orange, spring, 1$
source: url1.com
fruit, color, season, price
peppermint, green, fall, 3$
pear, yellow, fall, 4$
----> fruit, color, season, price, link
apple, red, winter, 2$, url1.com
watermelon, green, winter, 3$, url1.com
orange, orange, spring, 1$, url1.com
peppermint, green, fall, 3$, url1.com
pear, yellow, fall, 4$, url1.com
tomato, red, fall, 3$, url2.com
source: url2.com pumpking, orange, fall, 1$, url1.com
fruit, color, season, price
tomato, red, fall, 3$
pumpking, orange, fall, 1$
任何想法怎么做?
最佳答案
这应该可以解决问题:
def process_url(link):
return pd.concat(pd.read_html(link), ignore_index=False).assign(link=link)
说明:DataFrame.assign(new_column=expression)将向您的DF添加一个新的虚拟列。
演示:
In [2]: d1
Out[2]:
a b
0 1 10
1 2 20
In [3]: d2
Out[3]:
a b
0 11 100
1 12 200
In [4]: link = 'http://url1.com'
In [5]: pd.concat([d1, d2], ignore_index=True).assign(link=link)
Out[5]:
a b link
0 1 10 http://url1.com
1 2 20 http://url1.com
2 11 100 http://url1.com
3 12 200 http://url1.com