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
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
もしも 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
このようなデータを取り扱う場合は,header=None
を指定すると,自動的に列名を設定してくれます.
df = pd.read_csv(url, header=None)
df
列名を定義したい場合には names=['列名0', '列名1',...]
を指定します.
df = pd.read_csv(url, names=['ID', 'x', 'y'])
df
データフレームにおける各列のデータ形式は 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)
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