我有兴趣从网站中提取一些表,我定义了表所在的链接的列表。每个链接都有几张具有相同列数的表。因此,我使用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

10-07 12:35