如何在新列中保存读取pandas read_html()函数的url?

时间:2016-11-07 19:43:33

标签: python python-3.x pandas dataframe beautifulsoup

我有兴趣从网站中提取一些表格,我定义了表格所在的链接列表。每个链接都有几个具有相同列数的表格。所以,我将链接列表中的所有表提取到一个带有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)

我注意到,执行每个表的起源链接会很有帮助(即保存在一个新列中,链接来自最终表的行)。因此,我的问题是,如何在新专栏中执行pandas 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$

知道怎么做吗?。

1 个答案:

答案 0 :(得分:2)

这应该可以解决问题:

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