2018/02/02
2020/04/14
pandasでcsvファイルをデータフレームとして読み込む【Python3】
当記事ではPython3でデータ解析をするために、pandasというPythonのライブラリを用いて、csv形式のファイルをデータフレーム型 として読み込む方法を紹介いたします。当ページのプログラムは、自作のデータを使っています。同じことをしたい方は是非ダウンロードして一緒に手を動かして見てください!(通常のクリックでダウンロードが始まらない場合は、右クリックでリンク先のファイルをダウンロードを選択してください。)→サンプルcsvファイル
目次
データフレーム型ってそもそも何?
データフレームは、データを操作する上で非常に便利な性質を持っています。下図のような形で、見た目は行列と同じく、2次元配列のようになっていますが、データフレームの方は列名や行名を持ち、それによってデータを操作することも可能です。また、データフレームは複数のベクトルによって構成され、それぞれのベクトルは互いに同じ型である必要はありません。数値ベクトル、文字列ベクトルが混ざり合って、データフレームを構成することもあります。pandasはPythonでデータフレームを扱うライブラリであり、pythonでデータ解析をする上で、習得は必須と言っても過言ではありません

pandasでcsvファイルの読み込み
pandasでcsvファイルを読み込むときは、pandas.read_csv(“ファイル名”)を使います。今回はpandasだと長いのでpdでも使えるようにインポートの時に設定をしています。
import pandas as pd #pandasをpdとしてインポート
#データをdfに読み込み。pandasをpdとして利用。
df = pd.read_csv("sample.csv")
#dfの中身を確認
print(df)
このプログラムを当ページのサンプルファイルに対して実行するとコンソール画面では以下のようになります。
number age blood_pressure lung_capacity sex weight disease
0 1 22 110 4300 M 79 1
1 2 23 128 4500 M 65 1
2 3 24 104 3900 F 53 0
3 4 25 112 3000 F 45 0
4 5 27 108 4800 M 80 0
5 6 28 126 3800 F 50 0
6 7 28 126 3800 F 43 1
7 8 29 104 4000 F 55 1
8 9 30 125 3600 F 47 1
9 10 31 120 3400 F 49 1
10 11 32 116 3600 M 64 1
11 12 32 124 3900 M 61 0
12 13 33 106 3100 F 48 0
13 14 33 134 2900 F 41 0
14 15 34 128 4100 M 70 1
15 16 36 128 3420 M 55 1
16 17 37 116 3800 M 70 1
17 18 37 132 4150 M 90 1
18 19 38 134 2700 F 39 0
19 20 39 116 4550 M 86 1
20 21 40 120 2900 F 50 1
21 22 42 130 3950 F 65 1
22 23 46 126 3100 M 58 0
23 24 49 140 3000 F 45 0
24 25 50 156 3400 M 60 1
25 26 53 124 3400 M 71 1
26 27 56 118 3470 M 62 1
27 28 58 144 2800 M 51 0
28 29 64 142 2500 F 40 1
29 30 65 144 2350 F 42 0
ファイルの中身をそのままの形で読み込めているのがわかります。また列名は1行目を利用、行名は0から順番につけられていきます。これらは読み込み時に何もオプションを設定していないので、pandas側のデフォルトの設定で、オプションを指定することによって変えることも出来ます。
日本語を含むcsvファイルを読み込む場合
日本語を含むcsvファイルは文字コードをオプションで設定する必要があります。日本語が含まれているファイルは多くの場合、utf_8かshift_jisを指定すれば読み込めるようになるはずです。
import pandas as pd #pandasをpdとしてインポート
df = pd.read_csv("sample.csv", encoding="utf_8")
や、
import pandas as pd #pandasをpdとしてインポート
df = pd.read_csv("sample.csv", encoding="shift_jis")
としましょう。正しく文字コードを指定してあげないと、読み込みエラーや文字化けの原因になります。ちなみに、文字コードが原因で読み込めなかった場合、次のようなエラーメッセージが出ます。
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x94 in position 0: invalid start byte
これが出たら、文字コードオプションを適用してみましょう。
列名を決めてから読み込む方法
データの方に列名がない場合、読み込み時に列名を指定しながら読み込むことも可能です。その場合はオプションにnamesを使いましょう。
import pandas as pd #pandasをpdとしてインポート
#データの列名を決めて読み込み
df = pd.read_csv("sample.csv",names=('番号','年齢','血圧','肺活量','性別','病気','体重'))
番号 年齢 血圧 肺活量 性別 病気 体重
0 number age blood_pressure lung_capacity sex weight disease
1 1 22 110 4300 M 79 1
2 2 23 128 4500 M 65 1
3 3 24 104 3900 F 53 0
4 4 25 112 3000 F 45 0
5 5 27 108 4800 M 80 0
6 6 28 126 3800 F 50 0
7 7 28 126 3800 F 43 1
8 8 29 104 4000 F 55 1
9 9 30 125 3600 F 47 1
10 10 31 120 3400 F 49 1
11 11 32 116 3600 M 64 1
12 12 32 124 3900 M 61 0
13 13 33 106 3100 F 48 0
14 14 33 134 2900 F 41 0
15 15 34 128 4100 M 70 1
16 16 36 128 3420 M 55 1
17 17 37 116 3800 M 70 1
18 18 37 132 4150 M 90 1
19 19 38 134 2700 F 39 0
20 20 39 116 4550 M 86 1
21 21 40 120 2900 F 50 1
22 22 42 130 3950 F 65 1
23 23 46 126 3100 M 58 0
24 24 49 140 3000 F 45 0
25 25 50 156 3400 M 60 1
26 26 53 124 3400 M 71 1
27 27 56 118 3470 M 62 1
28 28 58 144 2800 M 51 0
29 29 64 142 2500 F 40 1
30 30 65 144 2350 F 42 0
このようにすると、列名にオプションで指定したものが利用され、csvファイルの1行目はデータフレームの要素となります。今回のデータの場合、1行目に列名が入っているいるので、これは必要ありませんね。
上の方の行をスキップして読み込み
csvファイルの上の方の行が解析などに不要な場合、skiprowsでそれをスキップすることもできます。skiprows=◯◯でスキップしたい行数を指定します。1行スキップの場合以下のようになります。
import pandas as pd
df = pd.read_csv('sample.csv', skiprows=1)
1行目を列名として読み込まない
オプションにheader=Noneを指定することで1行目を列名として扱いません。headerがないファイルの読みこみに適した手法です。
import pandas as pd
df = pd.read_csv('sample.csv', header=None)
0 1 2 3 4 5 6
0 number age blood_pressure lung_capacity sex weight disease
1 1 22 110 4300 M 79 1
2 2 23 128 4500 M 65 1
3 3 24 104 3900 F 53 0
4 4 25 112 3000 F 45 0
5 5 27 108 4800 M 80 0
6 6 28 126 3800 F 50 0
7 7 28 126 3800 F 43 1
8 8 29 104 4000 F 55 1
9 9 30 125 3600 F 47 1
10 10 31 120 3400 F 49 1
11 11 32 116 3600 M 64 1
12 12 32 124 3900 M 61 0
13 13 33 106 3100 F 48 0
14 14 33 134 2900 F 41 0
15 15 34 128 4100 M 70 1
16 16 36 128 3420 M 55 1
17 17 37 116 3800 M 70 1
18 18 37 132 4150 M 90 1
19 19 38 134 2700 F 39 0
20 20 39 116 4550 M 86 1
21 21 40 120 2900 F 50 1
22 22 42 130 3950 F 65 1
23 23 46 126 3100 M 58 0
24 24 49 140 3000 F 45 0
25 25 50 156 3400 M 60 1
26 26 53 124 3400 M 71 1
27 27 56 118 3470 M 62 1
28 28 58 144 2800 M 51 0
29 29 64 142 2500 F 40 1
30 30 65 144 2350 F 42 0
この場合、1行目の代わりに、0から順に割り振られた番号が列名として与えられます。
読み込みたい列を指定する
オプションでusecols=◯◯でint型のリストを◯◯に代入することで読み込む列を指定することもできます。例えば以下のプログラムでは、0列目、3列目、5列目のみを読み込むものです。(pythonでは、番号を0から数えます。)
import pandas as pd
df = pd.read_csv('sample.csv', usecols=[0,3,5])
number lung_capacity weight
0 1 4300 79
1 2 4500 65
2 3 3900 53
3 4 3000 45
4 5 4800 80
5 6 3800 50
6 7 3800 43
7 8 4000 55
8 9 3600 47
9 10 3400 49
10 11 3600 64
11 12 3900 61
12 13 3100 48
13 14 2900 41
14 15 4100 70
15 16 3420 55
16 17 3800 70
17 18 4150 90
18 19 2700 39
19 20 4550 86
20 21 2900 50
21 22 3950 65
22 23 3100 58
23 24 3000 45
24 25 3400 60
25 26 3400 71
26 27 3470 62
27 28 2800 51
28 29 2500 40
29 30 2350 42
全データに比べて、読み込むデータが小さくなるので、メモリの使用量が少なくなります。解析に使いたい列が事前に分かってる場合に非常に有効なオプションです。








Recommended