Python Pandas で様々なファイルを読み込み操作する

# Pandas ファイル操作

Pandas の導入や基礎に関しては、以下を参照してください。

- [Pandas の導入とデータ型 - Qiita](https://qiita.com/xza/items/88264d9ad4c14ff40215)

Pandas は外部ファイルを読み込む機能を保持しています

Pandas 公式が配布しているファイルを読み込みながら、データを操作してみます。

https://github.com/pandas-dev/pandas/tree/master/doc/data

上記のデータを「data」フォルダに保存した前提で、記述します。

# CSV を読む

基本的な CSV を読み込みます。

import して、「read_csv」で読む事が可能です。


```python
import pandas as pd
```


```python
df = pd.read_csv('data/baseball.csv')
```

info で情報を確認してみます。

```python

df.info()
```

```
    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 100 entries, 0 to 99
    Data columns (total 23 columns):
    id        100 non-null int64
    player    100 non-null object
    year      100 non-null int64
    stint     100 non-null int64
    team      100 non-null object
    lg        100 non-null object
    g         100 non-null int64
    ab        100 non-null int64
    r         100 non-null int64
    h         100 non-null int64
    X2b       100 non-null int64
    X3b       100 non-null int64
    hr        100 non-null int64
    rbi       100 non-null float64
    sb        100 non-null float64
    cs        100 non-null float64
    bb        100 non-null int64
    so        100 non-null float64
    ibb       100 non-null float64
    hbp       100 non-null float64
    sh        100 non-null float64
    sf        100 non-null float64
    gidp      100 non-null float64
    dtypes: float64(9), int64(11), object(3)
    memory usage: 18.0+ KB
```

info で見ると 100行ほどあるようなので、全てを表示するとみずらいので、先頭10行を見てみます。

```python

df[:10]
```

<div>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>id</th>
      <th>player</th>
      <th>year</th>
      <th>stint</th>
      <th>team</th>
      <th>lg</th>
      <th>g</th>
      <th>ab</th>
      <th>r</th>
      <th>h</th>
      <th>...</th>
      <th>rbi</th>
      <th>sb</th>
      <th>cs</th>
      <th>bb</th>
      <th>so</th>
      <th>ibb</th>
      <th>hbp</th>
      <th>sh</th>
      <th>sf</th>
      <th>gidp</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>88641</td>
      <td>womacto01</td>
      <td>2006</td>
      <td>2</td>
      <td>CHN</td>
      <td>NL</td>
      <td>19</td>
      <td>50</td>
      <td>6</td>
      <td>14</td>
      <td>...</td>
      <td>2.0</td>
      <td>1.0</td>
      <td>1.0</td>
      <td>4</td>
      <td>4.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>3.0</td>
      <td>0.0</td>
      <td>0.0</td>
    </tr>
    <tr>
      <th>1</th>
      <td>88643</td>
      <td>schilcu01</td>
      <td>2006</td>
      <td>1</td>
      <td>BOS</td>
      <td>AL</td>
      <td>31</td>
      <td>2</td>
      <td>0</td>
      <td>1</td>
      <td>...</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0</td>
      <td>1.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
    </tr>
    <tr>
      <th>2</th>
      <td>88645</td>
      <td>myersmi01</td>
      <td>2006</td>
      <td>1</td>
      <td>NYA</td>
      <td>AL</td>
      <td>62</td>
      <td>0</td>
      <td>0</td>
      <td>0</td>
      <td>...</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
    </tr>
    <tr>
      <th>3</th>
      <td>88649</td>
      <td>helliri01</td>
      <td>2006</td>
      <td>1</td>
      <td>MIL</td>
      <td>NL</td>
      <td>20</td>
      <td>3</td>
      <td>0</td>
      <td>0</td>
      <td>...</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0</td>
      <td>2.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
    </tr>
    <tr>
      <th>4</th>
      <td>88650</td>
      <td>johnsra05</td>
      <td>2006</td>
      <td>1</td>
      <td>NYA</td>
      <td>AL</td>
      <td>33</td>
      <td>6</td>
      <td>0</td>
      <td>1</td>
      <td>...</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0</td>
      <td>4.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
    </tr>
    <tr>
      <th>5</th>
      <td>88652</td>
      <td>finlest01</td>
      <td>2006</td>
      <td>1</td>
      <td>SFN</td>
      <td>NL</td>
      <td>139</td>
      <td>426</td>
      <td>66</td>
      <td>105</td>
      <td>...</td>
      <td>40.0</td>
      <td>7.0</td>
      <td>0.0</td>
      <td>46</td>
      <td>55.0</td>
      <td>2.0</td>
      <td>2.0</td>
      <td>3.0</td>
      <td>4.0</td>
      <td>6.0</td>
    </tr>
    <tr>
      <th>6</th>
      <td>88653</td>
      <td>gonzalu01</td>
      <td>2006</td>
      <td>1</td>
      <td>ARI</td>
      <td>NL</td>
      <td>153</td>
      <td>586</td>
      <td>93</td>
      <td>159</td>
      <td>...</td>
      <td>73.0</td>
      <td>0.0</td>
      <td>1.0</td>
      <td>69</td>
      <td>58.0</td>
      <td>10.0</td>
      <td>7.0</td>
      <td>0.0</td>
      <td>6.0</td>
      <td>14.0</td>
    </tr>
    <tr>
      <th>7</th>
      <td>88662</td>
      <td>seleaa01</td>
      <td>2006</td>
      <td>1</td>
      <td>LAN</td>
      <td>NL</td>
      <td>28</td>
      <td>26</td>
      <td>2</td>
      <td>5</td>
      <td>...</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>1</td>
      <td>7.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>6.0</td>
      <td>0.0</td>
      <td>1.0</td>
    </tr>
    <tr>
      <th>8</th>
      <td>89177</td>
      <td>francju01</td>
      <td>2007</td>
      <td>2</td>
      <td>ATL</td>
      <td>NL</td>
      <td>15</td>
      <td>40</td>
      <td>1</td>
      <td>10</td>
      <td>...</td>
      <td>8.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>4</td>
      <td>10.0</td>
      <td>1.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>1.0</td>
      <td>1.0</td>
    </tr>
    <tr>
      <th>9</th>
      <td>89178</td>
      <td>francju01</td>
      <td>2007</td>
      <td>1</td>
      <td>NYN</td>
      <td>NL</td>
      <td>40</td>
      <td>50</td>
      <td>7</td>
      <td>10</td>
      <td>...</td>
      <td>8.0</td>
      <td>2.0</td>
      <td>1.0</td>
      <td>10</td>
      <td>13.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>0.0</td>
      <td>1.0</td>
      <td>1.0</td>
    </tr>
  </tbody>
</table>
<p>10 rows × 23 columns</p>
</div>


read_csv のドキュメントは以下にあります。

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html

# Excel を読む

Excelを読む事ができます。「read_excel」を利用します。

Excelを読み込むには xlrd ライブラリ等が必要です。


```python
df = pd.read_excel('data/test.xls')
```


```python
df.info()
```

```
    <class 'pandas.core.frame.DataFrame'>
    DatetimeIndex: 7 entries, 2000-01-03 to 2000-01-11
    Data columns (total 4 columns):
    A    7 non-null float64
    B    7 non-null float64
    C    7 non-null float64
    D    7 non-null float64
    dtypes: float64(4)
    memory usage: 280.0 bytes
```


read_excel のドキュメントは以下にあります。

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_excel.html

# HTMLを読む

HTMLを簡単に読む事ができます。「read_html」を利用します。

当然ローカルのHTMLも読めますが、ネット上のHTMLを読み込む事ができます。

Wikipedia には [猫の品種の一覧 - Wikipedia](https://ja.wikipedia.org/wiki/%E7%8C%AB%E3%81%AE%E5%93%81%E7%A8%AE%E3%81%AE%E4%B8%80%E8%A6%A7) 
のような、HTML テーブル の表がありますので、これを読み込む事が可能です。


```python
url_str = 'https://ja.wikipedia.org/wiki/%E7%8C%AB%E3%81%AE%E5%93%81%E7%A8%AE%E3%81%AE%E4%B8%80%E8%A6%A7'
# header=0 を指定すると 0 行目をヘッダにします
# また指定URLの「全て」の表を取得します
df_lst = pd.read_html(url_str, header=0)
```

いくつの表を取得したかは len などで確認できます。

```python

print(len(df_lst))
```

```
    4
```

今回の場合、0 番目が猫一覧になっています。

```python
df_lst[0].head()
```


<div>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>種類</th>
      <th>原産国</th>
      <th>発生</th>
      <th>身体のタイプ</th>
      <th>毛足の長さ</th>
      <th>毛色および模様</th>
      <th>画像</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>アビシニアン</td>
      <td>エチオピア</td>
      <td>自然発生種</td>
      <td>フォーリン</td>
      <td>短毛</td>
      <td>複色</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>1</th>
      <td>アメリカンカール</td>
      <td>アメリカ合衆国</td>
      <td>突然変異</td>
      <td>セミフォーリン</td>
      <td>短毛もしくは長毛</td>
      <td>単色</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>2</th>
      <td>アメリカンショートヘア</td>
      <td>アメリカ合衆国</td>
      <td>自然発生種</td>
      <td>セミコビー</td>
      <td>短毛</td>
      <td>All</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>3</th>
      <td>アメリカンボブテイル</td>
      <td>アメリカ合衆国</td>
      <td>自然発生種</td>
      <td>ロング＆サブスタンシャル</td>
      <td>短毛もしくは長毛</td>
      <td>All</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>4</th>
      <td>アメリカンワイヤーヘア</td>
      <td>アメリカ合衆国</td>
      <td>突然変異</td>
      <td>セミコビー</td>
      <td>Rex</td>
      <td>All but colorpoint</td>
      <td>NaN</td>
    </tr>
  </tbody>
</table>
</div>



read_html のドキュメントは以下にあります。

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_html.html

# その他
その他に SQLite ファイル等も読めます。以下の公式サイトをご確認ください。

[IO Tools (Text, CSV, HDF5, ...) — pandas 0.22.0 documentation](http://pandas.pydata.org/pandas-docs/stable/io.html)

# 書いた人に関して
[Tech Fun株式会社](http://www.techfun.co.jp/)スペシャリスト、xza です。

社内で開催した初学者向け勉強会で利用した資料等を公開しています。