2018年4月27日金曜日

プログラミング学習:pandasでweb上の表を取得する。(python)

edx UCバークレー データサイエンス基礎講座のweek 1課題で、各国の女性の平均教育期間データをグラフ化するというのがありました。edxの講座内では、データがサーバー上に用意されているのですが、再現するにはデータを取得する必要があります。

Gapminder Data
https://www.gapminder.org/data/

上記サイトのMean years in school (women 25 years and older)というデータです。

Mean years in school (women 25 years and older)
https://docs.google.com/spreadsheets/d/1kmnYQzXLGVF9RbKB3Y-WuUsJFumnE4s2UWdmlskv6r4/pub

googleスプレッドシート形式で保存されています。なぜかcsv形式でのダウンロードができなかったので、この表をpythonで取得してみます。pandasを使うと簡単でした。

参考にしたのはこちら↓
Python, pandasでwebページの表(htmlのtable)をスクレイピング
https://note.nkmk.me/python-pandas-web-html-table-scraping/
HTML の表(table タグ) をスクレイピングする時も pandas が超便利
http://www.python.ambitious-engineer.com/archives/1174

まずはpandasをpdとしてimport。
import pandas as pd

そのほか、lxml, html5lib, BeautifulSoup4のパッケージも必要のようなので、インストールされていなければpipでインストールしてください。(anacondaでは元々入っていました)

urlを指定してread_htmlで表をリストに取得。
df_tmp = pd.read_html("https://docs.google.com/spreadsheets/d/1kmnYQzXLGVF9RbKB3Y-WuUsJFumnE4s2UWdmlskv6r4/pub",header=0)

read_htmlではhtmlからtableタグを見つけて、表をデータフレーム形式で取得します。一つのページに複数の表がある場合は、それぞれ違うデータフレームとしてリストに格納します。オプションの「header=0」で、1行目を列名として利用しています。

取得した表の数の確認
len(df_tmp)
6

lenでリストに格納された要素数を数えます。6なので、6個の表があったようです。

データ確認
df_tmp[0].head()

1Row Labels19701971197219731974197519761977...2000200120022003200420052006200720082009
02Afghanistan0.00.10.10.10.10.10.10.1...0.20.30.30.30.30.30.30.30.30.4
13Albania3.94.04.14.24.34.54.64.7...8.08.28.38.58.68.88.99.19.29.4
24Algeria0.60.60.60.70.70.80.80.9...3.03.13.23.43.53.63.83.94.04.2
35Angola0.50.50.50.50.60.60.60.7...1.92.02.12.22.32.42.52.62.72.8
46Antigua and Barbuda7.07.17.27.47.57.77.88.0...11.211.411.511.611.711.811.912.012.112.2
5 rows × 42 columns

df_tmpに格納された最初の表[0]を見てみます。ここに目的の表が最初にあったようです。ちなみにリスト内[1]から[5]までは違う表が入っています。

表の一番左はindexでpandasが付けた行番号。その左に元からあったとみられる行番号がありますが、これは不要なので削除します。

列削除
df=df_tmp[0]
df=df.drop("1",axis=1)
df.head()
Row Labels197019711972197319741975197619771978...2000200120022003200420052006200720082009
0Afghanistan0.00.10.10.10.10.10.10.10.1...0.20.30.30.30.30.30.30.30.30.4
1Albania3.94.04.14.24.34.54.64.74.8...8.08.28.38.58.68.88.99.19.29.4
2Algeria0.60.60.60.70.70.80.80.90.9...3.03.13.23.43.53.63.83.94.04.2
3Angola0.50.50.50.50.60.60.60.70.7...1.92.02.12.22.32.42.52.62.72.8
4Antigua and Barbuda7.07.17.27.47.57.77.88.08.1...11.211.411.511.611.711.811.912.012.112.2
5 rows × 41 columns

列名"1"を削除しました。df.dropで列名、axis=1で列方向と指定しています。ちなみに、列番号を指定して削除する場合は df.drop(df.columns[0],axis=1) とします。この方法がなかなか分からず、苦労しました。

csv保存
df.to_csv("school_women.csv", sep=",",index=False) 
念のためcsvに保存。sepで区切り文字(,)を指定。index=Falseで列番号を付けずに保存します。

こんな感じで、pandasを使うとweb上の表を簡単に取得できました。


参考:
Python, pandasでwebページの表(htmlのtable)をスクレイピング
https://note.nkmk.me/python-pandas-web-html-table-scraping/
HTML の表(table タグ) をスクレイピングする時も pandas が超便利
http://www.python.ambitious-engineer.com/archives/1174

edx UC Berkeley Foundations of Data Science(UCバークレー データサイエンス基礎講座)
ttps://www.edx.org/professional-certificate/berkeleyx-foundations-of-data-science
Computational Thinking with Python(pythonによるプログラミング的思考)
https://www.edx.org/course/foundations-data-science-computational-uc-berkeleyx-data8-1x

プログラミング学習:edx UCバークレー データサイエンス基礎講座の紹介(python)
https://eneprog.blogspot.com/2018/04/edx-uc-python.html

0 件のコメント:

コメントを投稿

//SyntaxHighlighter CDNより https://cdnjs.com/libraries/SyntaxHighlighter // 対応言語