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