GooglSheets&Julia&Python&R: HTMLの表を読み込む ver. 2

Last Updated on

I.何をする

 

コピー&ペーストせずに、Webページの表を読み込みます。

さまざまな解説がありますが、実際にはうまくできなくてコピー&ペーストでやってしまうことも多いのではないでしょうか。

ここでは、実際に使用する際のポイントを紹介します。

 

II.Wikipediaの表

 

Webページ

 

COVID-19 pandemic in Japan

 

読み取る表: 複雑な(nested)構成 です。

 

 

1.Google Sheetsが一番わかりやすい

 

次の関数で、非常にわかりやすく表示されます。

複雑な表の構成をうまくセルに配分しており、HTMLの表は小さいので、シート上で簡単に修正できます。

 

関数

 

IMORTHTML("対象のURL","table",何番目の表か) 

 

取得した表

 

 

使用方法

 

関数で取得されたデータを集計することはできません。集計する場合は、データをコピーして、別のシートに値のみを貼り付けます

 

2.Pytonは、行と列を指定してサプセットを取得

 

Pandasだけでできるので簡単ですが、表が入れ子型に複雑なので、構成を確認して行と列をしていてサブセットを取得します。

この表は最終行の文字が長いためコンソールにうまく表示されませんのでとまどいますが、構成がわかれば、iloc()で行と列を指定すれば、下のようにデータフレームとして取得できます。

 

スクリプト

 

import pandas as pd
df0 = pd.read_html('https://en.wikipedia.org/wiki/COVID-19_pandemic_in_Japan')
df0_8 = df0[8] # 8番目の表を取り出す
df0_tb = df0_8.iloc[0:9,1:7] # 1−9行、2-7列を取り出す
df0_tb
 

 

取得した表

 

df0_tb
Out[65]: 
    Classification  Cases         Deaths         Lethality(%)
  Classification.1 Number     (%) Number     (%) Lethality(%)
0         Above 80    982   (7.7)    125  (50.6)       (12.7)
1            70–79   1194   (9.4)     70  (28.3)        (5.9)
2            60–69   1517  (11.9)     29  (11.7)        (1.9)
3            50–59   2223  (17.5)     12   (4.9)        (0.5)
4            40–49   2118  (16.7)      5   (2.0)        (0.2)
5            30–39   1908  (15.0)      2   (0.8)        (0.1)
6            20–29   2086  (16.4)      2   (0.0)        (0.0)
7            10–19    293   (2.3)      0   (0.0)        (0.0)
8              0–9    204   (1.6)      0   (0.0)        (0.0)

 

3.RはPythonと同様の手順

 

行と列の指定が、Pythonと異なるのは、Pythonは第1行目、第1列目が0ですが、Rでは1です。また、Pythonでは、1:9の場合、9を含めませんが、Rは9を含めるからです。

as_tibbleでtididyverseで扱える形式に変えています。データフレームのままでよいなら、変換する必要はありませんし、tidyverseをインポートする必要はありません。

 

スクリプト

 

library(htmltab)
library(tidyverse)
url <- "https://en.wikipedia.org/wiki/COVID-19_pandemic_in_Japan"
df0 <- htmltab(doc = url, which = 9) # 9番目の表
df0_subset <- df0[c(1:9),c(2:7)] # 行と列を指定
df0_subset_tibble <- as_tibble(df0_subset) # 扱いやすいようにtibbleに変換
df0_subset_tibble
 

 

取得した表

 

> df0_subset_tibble
# A tibble: 9 x 6
  Classification `Cases >> Number` `Cases >> (%)` `Deaths >> Number` `Deaths >> (%)` `Lethality(%)`
  <chr>          <chr>             <chr>          <chr>              <chr>           <chr>         
1 Above 80       982               (7.7)          125                (50.6)          (12.7)        
2 70–79          1,194             (9.4)          70                 (28.3)          (5.9)         
3 60–69          1,517             (11.9)         29                 (11.7)          (1.9)         
4 50–59          2,223             (17.5)         12                 (4.9)           (0.5)         
5 40–49          2,118             (16.7)         5                  (2.0)           (0.2)         
6 30–39          1,908             (15.0)         2                  (0.8)           (0.1)         
7 20–29          2,086             (16.4)         2                  (0.0)           (0.0)         
8 10–19          293               (2.3)          0                  (0.0)           (0.0)         
9 0–9            204               (1.6)          0                  (0.0)           (0.0)

 

 

 

 

 

Please follow and like us:

About shibatau

I was born and grown up in Kyoto. I studied western philosophy at the University and specialized in analytic philosophy, especially Ludwig Wittgenstein at the postgraduate school. I'm interested in new technology, especially machine learning and have been learning R language for two years and began to learn Python last summer. Listening toParamore, Sia, Amazarashi and MIyuki Nakajima. Favorite movies I've recently seen: "FREEHELD". Favorite actors and actresses: Anthony Hopkins, Denzel Washington, Ellen Page, Meryl Streep, Mia Wasikowska and Robert DeNiro. Favorite books: Fyodor Mikhailovich Dostoyevsky, "The Karamazov Brothers", Shinran, "Lamentations of Divergences". Favorite phrase: Salvation by Faith. Twitter: @shibatau

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.