2016-11-07 4 views
2

私はウェブサイトからいくつかのテーブルを抽出することに興味があり、テーブルが存在するリンクのリストを定義しました。各リンクには同じ数のカラムを持ついくつかのテーブルがあります。以下のように、私はパンダread_html()機能を持つ単一のテーブルにリンクのリストからすべてのテーブルを抽出しています:pandas read_html()関数を読み込んでいるURLを新しい列に保存するにはどうすればいいですか?

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である:

TABLE1:

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$  

表Aで3生活in 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 

別の例は、このテーブル1と表2はurl1.comであることに注意し、「図」です。一方、表3はurl2.comにあります。上記の機能を私は別のリンクにあるテーブルから単一のテーブルを作成し、私の目的は、(ちょうどrefereceを節約するために)テーブルが抽出された場所で適合される列を作成することです:

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に新しい仮想列を追加します

+1

あなたの質問を明確にすることはできますか?あなたが何を求めているのか分かりません。 「各テーブルの出所リンクを実行する」とはどういう意味ですか? –

答えて

2

これはトリックを行う必要があります。

デモ:

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 
+0

ありがとう、マックス! – tumbleweed

+1

@タンブルウィード、嬉しいことに助けてもらえました:) – MaxU

+0

ちょっと@MaxU、テーブルの各行に識別子を割り当てる方法はありますか?...ただ行の参照を失うことはありませんか? (例:各行がどこに属しているかを特定する番号)。 – tumbleweed

関連する問題