2018/02/02

2020/04/14

pandasでcsvファイルをデータフレームとして読み込む【Python3】

Python

ライター:

当記事では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

全データに比べて、読み込むデータが小さくなるので、メモリの使用量が少なくなります。解析に使いたい列が事前に分かってる場合に非常に有効なオプションです。

(totalcount 63,281 回, dailycount 144回 , overallcount 16,590,940 回)

ライター:

Python

single-banner

COMMENT

コメントを残す

メールアドレスが公開されることはありません。
*は必須項目です。




CAPTCHA