Python入門トップページ


目次

  1. Pandas とは
  2. Pandas を利用するための準備
  3. CSV ファイルを読み込む
  4. DataFrame を表示する
  5. 列や行を抽出する
  6. 列名を抽出する
  7. Python リストに変換する
  8. Python リストから DataFrame に変換する
  9. DataFrame から NumPy 配列に変換する
  10. 基本統計量を出力する
  11. CSV ファイルに書き出す
  12. グループ化とピボットテーブル
  13. データフレームの結合(系列名が等しいとき)
  14. データフレームの結合(系列名が異なるとき)
  15. データフレームの連結

Pandas

CSV ファイルを読み込む

目次に戻る

Webサイトからの読み込み

CSV (comma separated values) ファイルはその名の通りカンマで区切られた値のテキストファイルです.Pandas では pd.read_csv( ) によって CSV ファイルを Web サイトからダウンロードして読み込んだり,手元の PC にある(自身で作成した CSV やダウンロードした CSV)ファイルを読み込むことができます.まずは,GitHub のリポジトリにあるサンプルデータ (clustering-sample.csv) を Pandas のデータフレームに読み込んでみます.

Web サイトから CSV ファイルを読み込む
import pandas as pd # プログラムの先頭でモジュールを読み込む
# URL を指定する(GitHubから読み込むときには ?raw=true パラメータが必要)
url = "https://github.com/rinsaka/sample-data-sets/blob/master/clustering-sample.csv?raw=true"
# CSV ファイルをデータフレームに読み込む
df = pd.read_csv(url)
# データフレームを表示する
df
pandas-01

目次に戻る

ローカルファイルの読み込み

GitHub のリポジトリからダウンロードしたり,自身で作成した CSV ファイルは次のような形式になります.

clustering-sample.csv
ID,x,y
0,7.4346,6.6520
1,6.5419,6.3611
2,8.9819,9.2461
3,3.8554,4.8386
4,1.9527,3.4848

...(中略)...

295,4.1205,1.5010
296,9.2843,1.7563
297,6.6627,7.3856
298,5.7654,6.0543
299,2.2411,1.0902

上のような CSV ファイルを読み込んでみよう.プログラムと同じフォルダ(カレントディレクトリ)にある CSV ファイルを読み込むためには,pd.read_csv( ) にファイルへのパスを指定するだけで良いでしょう.これだけで,CSV ファイルを読み込み DataFrame に格納することができます.

カレントディレクトリにある CSV ファイルを読み込む
import pandas as pd # プログラムの先頭でモジュールを読み込む
fname = "clustering-sample.csv"
df = pd.read_csv(fname)
df
pandas-01

目次に戻る

列名の指定

もしも CSV ファイルの先頭行に列名がなく,1行目からデータが保存されている場合,オプションを指定しなければ,1行目のデータが列名であると認識されてしまいます.この結果,行数が299になっていることにも注意してください.


url = "https://github.com/rinsaka/sample-data-sets/blob/master/clustering-sample-notitle.csv?raw=true"
df = pd.read_csv(url)
df
pandas-21

このようなデータを取り扱う場合は,header=None を指定すると,自動的に列名を設定してくれます.


df = pd.read_csv(url, header=None)
df
pandas-22

列名を定義したい場合には names=['列名0', '列名1',...] を指定します.


df = pd.read_csv(url, names=['ID', 'x', 'y'])
df
pandas-01

目次に戻る

データ形式の確認

データフレームにおける各列のデータ形式は df.dtypes で確認できます.この結果,「ID」列は64ビット整数型,「x」と「y」列は64ビットの実数型であることがわかります.


df.dtypes
ID      int64
x     float64
y     float64
dtype: object

目次に戻る

日付・時刻データの読み込み

次は GitHub のリポジトリから,ある機器販売会社の受注データを読み込んでみよう.


url = "https://github.com/rinsaka/sample-data-sets/blob/master/machine-sales.csv?raw=true"
df = pd.read_csv(url)
print(df)
       id       date branch  staff  amount
0    1001  2018/7/16   Kobe    Eto   44000
1    1002  2018/7/10   Kobe  Gondo  186340
2    1003  2018/7/12  Osaka   Sato  155260
3    1004  2018/7/15  Osaka   Kato   65406
4    1005  2018/7/11  Osaka   Sato  359790
..    ...        ...    ...    ...     ...
794  1795  2020/4/29   Kobe  Saito   52500
795  1796  2020/4/30  Osaka   Kato  133200
796  1797  2020/4/28  Osaka   Kito  305500
797  1798  2020/4/30  Osaka  Hyodo  374000
798  1799  2020/4/30  Osaka   Kato    4500

[799 rows x 5 columns]

上の表示を一見すると正しく読み込めていそうです.しかしながら各列のデータ型を確認すると,「data」列が「branch」や「staff」と同様に「object」型(ここでは文字列の意味)になっています.このとき,「date」列について日付処理を行おうとしても正しく動作しないことになります.


df.dtypes
id         int64
date      object
branch    object
staff     object
amount     int64
dtype: object

日付形式で読み込みたい場合は parse_dates オプションを指定すると良いでしょう.


url = "https://github.com/rinsaka/sample-data-sets/blob/master/machine-sales.csv?raw=true"
# date 列は日付形式で読み込む
df = pd.read_csv(url, parse_dates=["date"])
print(df)
       id       date branch  staff  amount
0    1001 2018-07-16   Kobe    Eto   44000
1    1002 2018-07-10   Kobe  Gondo  186340
2    1003 2018-07-12  Osaka   Sato  155260
3    1004 2018-07-15  Osaka   Kato   65406
4    1005 2018-07-11  Osaka   Sato  359790
..    ...        ...    ...    ...     ...
794  1795 2020-04-29   Kobe  Saito   52500
795  1796 2020-04-30  Osaka   Kato  133200
796  1797 2020-04-28  Osaka   Kito  305500
797  1798 2020-04-30  Osaka  Hyodo  374000
798  1799 2020-04-30  Osaka   Kato    4500

[799 rows x 5 columns]

そうすると,「date」列を datetime64[ns] 形式として読み込むことができました.


df.dtypes
id                 int64
date      datetime64[ns]
branch            object
staff             object
amount             int64
dtype: object

目次に戻る

日本語データの読み込み

CSV ファイル内に日本語文字列等が含まれるとき,場合によってはエラーが発生して正しく読み込むことができないことがあります.概ね UTF-8 で作成された CSV ファイルは問題なく読み込めることが多そうです.


url = "https://github.com/rinsaka/sample-data-sets/blob/master/machine-sales-utf8.csv?raw=true"
df = pd.read_csv(url, parse_dates=["date"])
print(df)
       id       date branch staff  amount
0    1001 2018-07-16     神戸    江藤   44000
1    1002 2018-07-10     神戸    権藤  186340
2    1003 2018-07-12     大阪    佐藤  155260
3    1004 2018-07-15     大阪    加藤   65406
4    1005 2018-07-11     大阪    佐藤  359790
..    ...        ...    ...   ...     ...
794  1795 2020-04-29     神戸    斎藤   52500
795  1796 2020-04-30     大阪    加藤  133200
796  1797 2020-04-28     大阪    木藤  305500
797  1798 2020-04-30     大阪    兵藤  374000
798  1799 2020-04-30     大阪    加藤    4500

[799 rows x 5 columns]

もしも UnicodeDecodeError 等のエラーが発生してしまう場合はファイルの文字コードを調査して,明示的に encoding='utf-8'encoding='sjis' などを指定すると良いでしょう.

文字コード utf-8 を明示的に指定
url = "https://github.com/rinsaka/sample-data-sets/blob/master/machine-sales-utf8.csv?raw=true"
df = pd.read_csv(url, parse_dates=["date"], encoding='utf-8')
print(df)
文字コード sjis (Shift-JIS) を指定
url = "https://github.com/rinsaka/sample-data-sets/blob/master/machine-sales-sjis.csv?raw=true"
df = pd.read_csv(url, parse_dates=["date"], encoding='sjis')
print(df)

目次に戻る

テキストファイルやExcelファイルの読み込み

Pandas では次のように read_csv メソッドを使ってカンマで区切られたテキストファイルからデータを読み込むことができます.


url = "https://github.com/rinsaka/sample-data-sets/blob/master/store-space-sales.csv?raw=true"
df = pd.read_csv(url)
print(df)
   store  space  sales
0      A     26     65
1      B     28     65
2      C     25     62
3      D     26     59
4      E     28     69
5      F     33     73
6      G     32     79
7      H     29     71
8      I     30     73
9      J     29     71
10     K     38     86
11     L     40     88
12     M     32     71
13     N     26     63
14     O     34     80

しかしながら,sep 引数によってデータの区切り文字を指定すると,スペース区切りやタブ文字区切りのテキストファイルを読み込むことも可能です.スペース区切りのテキストファイルを読み込むには次のようにします.


url = "https://github.com/rinsaka/sample-data-sets/blob/master/store-space-sales.txt?raw=true"
df = pd.read_csv(url, sep=' ')
print(df)
   store  space  sales
0      A     26     65
1      B     28     65
2      C     25     62
3      D     26     59
4      E     28     69
5      F     33     73
6      G     32     79
7      H     29     71
8      I     30     73
9      J     29     71
10     K     38     86
11     L     40     88
12     M     32     71
13     N     26     63
14     O     34     80

タブ区切りのテキストファイルを読み込む場合も sep='\t' を指定すれば良いでしょう.


url = "https://github.com/rinsaka/sample-data-sets/blob/master/store-space-sales-tab.txt?raw=true"
df = pd.read_csv(url, sep='\t')
print(df)
   store  space  sales
0      A     26     65
1      B     28     65
2      C     25     62
3      D     26     59
4      E     28     69
5      F     33     73
6      G     32     79
7      H     29     71
8      I     30     73
9      J     29     71
10     K     38     86
11     L     40     88
12     M     32     71
13     N     26     63
14     O     34     80

さらに read_excel メソッドで Excel ファイルを読み込んでデータフレームに格納できます.


url = "https://github.com/rinsaka/sample-data-sets/blob/master/store-space-sales.xlsx?raw=true"
df = pd.read_excel(url)
print(df)
   store  space  sales
0      A     26     65
1      B     28     65
2      C     25     62
3      D     26     59
4      E     28     69
5      F     33     73
6      G     32     79
7      H     29     71
8      I     30     73
9      J     29     71
10     K     38     86
11     L     40     88
12     M     32     71
13     N     26     63
14     O     34     80

目次に戻る