PythonのPandas(パンダスと読みます)とは「CSVなどのデータを簡単に扱えるようにするために開発された」Pythonのライブラリです。
Pandasは1次元配列も扱えますが、基本的にはExcelのような2次元のデータを扱うことに長けています。
ここでは
- PythonのPandasは何ができるの?
- PythonのPandasの使い方は?
- PythonのSeriesやDataFrameって何?
といった疑問に答えつつ、Pandasについて解説します。
目次
PythonのPandasをインストールする(Macの場合)
Pandasは標準ライブラリではないのでインストールしてから使う必要があります。
いくつか方法はありますが、ここではpipを使ってPandasをインストールします。
ターミナルで次のコマンドを実行してください。
$ pip install pandas
インストールが開始されるので少し待ちましょう。インストールが完了したら次のコマンドを入力してインストールされていることを確認します。
$ pip list installed | grep pandas
すでにpipでインストール済みのライブラリからpandasを検索して表示しています。
PandasとPandasのバージョンが表示されればOKです。
PythonのPandasの使い方
では実際にPandasを使ってみましょう。ここではCSVからデータを取得し、そこから行や列のデータを取得したり、データを追加・更新・削除したり、再度CSVに書き込んだりといったことを実践していきます。
CSVからデータを読み込む
まずはCSVからデータを読み込みます。今回は次のようなデータが入っているCSVファイルを読み込む想定です。
連番,氏名,性別,携帯電話,メールアドレス
0,平沢 亘輝,0,09021610957,kouki588@sfvxkqyn.tn
1,窪田 敏彦,0,09077222346,toshihiko427@lzzluhvdh.fo
2,福田 紀男,0,08065397459,voj=bspnorio62995@dfocvafb.nnpus.il
3,奥山 芳雄,0,08047970631,ookuyama@lnmtmp.tjm.wo
4,寺崎 萌子,1,08057033061,fpxqismoeko99339@sbguqyxew.mepvn.rn
こういったテストデータは擬似データ作成ができるサイトを使うと便利です。今回のデータはこちらのサイト様を活用させていただきました。
このCSVファイルのデータをpandasで読み込むにはcsv_read()を使います。
import pandas as pd
csv_data = pd.read_csv("input.csv",index_col = 0)
print(csv_data)
print(type(csv_data))
氏名 性別 携帯電話 メールアドレス
連番
0 平沢 亘輝 0 9021610957 kouki588@sfvxkqyn.tn
1 窪田 敏彦 0 9077222346 toshihiko427@lzzluhvdh.fo
2 福田 紀男 0 8065397459 voj=bspnorio62995@dfocvafb.nnpus.il
3 奥山 芳雄 0 8047970631 ookuyama@lnmtmp.tjm.wo
4 寺崎 萌子 1 8057033061 fpxqismoeko99339@sbguqyxew.mepvn.rn
<class 'pandas.core.frame.DataFrame'>
Pandasのread_csv()を使うことで、たった1行でCSVデータを取り込むことができました。
read_csv()の1つ目の引数はファイルのパスです。環境やCSVの配置場所によって変わってくるので、ご自身の状況に合ったパスを指定してください。ここではPythonの実行ファイルと同じディレクトリに配置したinput.csvを読み込んでいます。
2つの引数はどの列をインデックスにするかを指定しています。今回はちょうどCSV内に連番のデータがあったので、連番の列をインデックスに指定しています。
取得したCSVデータはそのままprint()で出力して中身を確認できます。CSVデータと同じデータを変数に格納できているのがわかります。
また、取得したデータは「DataFrame」というクラスであることがわかります。DataFrameとはPandasで2次元配列を扱うために用意されたクラスです。加えて1次元のデータを扱うには「Series」というクラスが用意されています(詳しくは後述)。
読み込んだデータの情報を取得
いくつかの方向から、読み込んだデータの情報を取得してみましょう。なお、ここで紹介するメソッドは全てDataFrameクラスで定義されているメソッドです。
データの行数・列数を取得する
データの行数・列数を取得したい場合はshapeを使います(メンバなのでカッコはいりません)。
import pandas as pd
data_frame = pd.read_csv("input.csv", index_col = 0)
print(data_frame.shape)
(5, 4)
先頭から指定した行数を取得する
先頭から指定した行数だけデータを取得したい場合はhead()を使います。マイナス値を指定することもできます。
import pandas as pd
data_frame = pd.read_csv("input.csv", index_col = 0) #5行のDataFrame
print(data_frame.head(2))
print(data_frame.head(-2))
氏名 性別 携帯電話 メールアドレス
連番
0 平沢 亘輝 0 9021610957 kouki588@sfvxkqyn.tn
1 窪田 敏彦 0 9077222346 toshihiko427@lzzluhvdh.fo
氏名 性別 携帯電話 メールアドレス
連番
0 平沢 亘輝 0 9021610957 kouki588@sfvxkqyn.tn
1 窪田 敏彦 0 9077222346 toshihiko427@lzzluhvdh.fo
2 福田 紀男 0 8065397459 voj=bspnorio62995@dfocvafb.nnpus.il
末尾から指定した行数を取得する
末尾からデータを取得したい場合はtail()を使います。こちらもマイナス値を指定できます。
import pandas as pd
data_frame = pd.read_csv("input.csv", index_col = 0) #5行のDataFrame
print(data_frame.tail(2))
print(data_frame.tail(-2))
氏名 性別 携帯電話 メールアドレス
連番
3 奥山 芳雄 0 8047970631 ookuyama@lnmtmp.tjm.wo
4 寺崎 萌子 1 8057033061 fpxqismoeko99339@sbguqyxew.mepvn.rn
氏名 性別 携帯電話 メールアドレス
連番
2 福田 紀男 0 8065397459 voj=bspnorio62995@dfocvafb.nnpus.il
3 奥山 芳雄 0 8047970631 ookuyama@lnmtmp.tjm.wo
4 寺崎 萌子 1 8057033061 fpxqismoeko99339@sbguqyxew.mepvn.rn
DataFrameの使い方
read_csv()で取得したcsvはDataFrameというクラスのオブジェクトです。
DataFrameは2次元の配列で、1次元配列のSeriesというオブジェクトで構成されています。
ここではDataFrameの作成方法と、データの追加・参照・変更・削除の方法を見てみましょう。
DataFrameの作り方
DataFrameはcsvやExcelから作ることもできますが、通常のリストやNumPyのndarrayから作ることもできます。今回はndarrayからDaraFrameを作ります。
import numpy as np
import pandas as pd
np_list = np.array(list(range(10, 100, 10))).reshape(3, 3)
d = pd.DataFrame(np_list)
d.columns = ["A", "B", "C"]
d.index = ["α", "β", "γ"]
print(d)
A B C
α 10 20 30
β 40 50 60
γ 70 80 90
pd.DataFrame()にndarrayを渡してDataFrameを作成しました。
columnsとindexにはそれぞれ横と縦のデータの名称を設定できます。
データを追加・変更する
DataFrameにデータを追加・変更するには同じくリストを使います。
列も行も追加・変更可能で、列はインデックス番号、行はインデックス番号の他にlocというメンバを参照します。
データを追加したい場合は最大のインデックス番号+1の数値を、変更したい場合は変更する行または列のインデックス番号を指定します。
import numpy as np
import pandas as pd
np_list = np.array(list(range(10, 100, 10))).reshape(3, 3)
d = pd.DataFrame(np_list)
d2 = ["11", "22", "33"]
d[3] = d2
d.columns = ["A", "B", "C", "D"] #列を追加するので1つ増やす
d.index = ["α", "β", "γ"]
print(d)
A B C D
α 10 20 30 11
β 40 50 60 22
γ 70 80 90 33
上記の例では列を追加しています。列を追加する際はcolumnsに要素を一つ追加する必要があります(追加しないとエラーになるので注意)
import numpy as np
import pandas as pd
np_list = np.array(list(range(10, 100, 10))).reshape(3, 3)
d = pd.DataFrame(np_list)
d2 = ["11", "22", "33"]
d.loc[3] = d2 #locを参照
d.columns = ["A", "B", "C"]
d.index = ["α", "β", "γ", "δ"] #行を追加する場合はこっちを増やす
print(d)
A B C
α 10 20 30
β 40 50 60
γ 70 80 90
δ 11 22 33
こちらは行を追加するパターンです。locメンバを使う以外は列を追加する場合とほとんど同じです。
データの参照
データを参照する場合は、先ほど行を追加する際に使ったlocを使います。
import numpy as np
import pandas as pd
np_list = np.array(list(range(10, 100, 10))).reshape(3, 3)
d = pd.DataFrame(np_list)
d.columns = ["A", "B", "C"]
print(d.loc[1, "B"])
50
loc[行のインデックス, 列のインデックス]で指定することで値を取得しています。今回は行のindexを指定していないので、デフォルトで割り当てられるインデックス番号を指定しています。
また、locはスライスに対応しています。少し複雑になりますが、次のように範囲を指定します。
import numpy as np
import pandas as pd
np_list = np.array(list(range(10, 100, 10))).reshape(3, 3)
d = pd.DataFrame(np_list)
d.columns = ["A", "B", "C"]
print(d.loc[1:2, "B":"C"]) #1〜2行目,B〜C列目のデータを取得
B C
1 50 60
2 80 90
1:2で1行目〜2行目、”B”:”C”でB〜C列を指定しています。
スライスについてはこちらも参照ください。
データを削除する
DataFrameのデータを削除する場合はdrop()を使います。drop()した結果を受け取る必要があるので注意しましょう。下の例は指定した行を削除しています。
import numpy as np
import pandas as pd
np_list = np.array(list(range(10, 100, 10))).reshape(3, 3)
d = pd.DataFrame(np_list)
d.columns = ["A", "B", "C"]
d.index = ["α", "β", "γ"]
d = d.drop("α", axis=0)
print(d)
A B C
β 40 50 60
γ 70 80 90
1つ目の引数に行のインデックス、2つ目の引数は行と列どちらを削除するかを0, 1で指定します。
axis=1を指定することで列を削除することもできます。
import numpy as np
import pandas as pd
np_list = np.array(list(range(10, 100, 10))).reshape(3, 3)
d = pd.DataFrame(np_list)
d.columns = ["A", "B", "C"]
d.index = ["α", "β", "γ"]
d = d.drop("B", axis=1)
print(d)
A C
α 10 30
β 40 60
γ 70 90
DataFrameをCSVに出力する
Pandasを使えばto_csv()で非常に簡単にCSV出力できます。
read_csv()で読み込んだデータを加工して、再度別のcsvに出力してみましょう。
import pandas as pd
input_data = pd.read_csv("input.csv", index_col = 0)
input_data = input_data.drop("メールアドレス", axis=1)
input_data.loc[5] = ["遠藤 春雄", "0", "9027321920"]
input_data.to_csv("output.csv")
[output.csv]
連番,氏名,性別,携帯電話
0,平沢 亘輝,0,9021610957
1,窪田 敏彦,0,9077222346
2,福田 紀男,0,8065397459
3,奥山 芳雄,0,8047970631
4,寺崎 萌子,1,8057033061
5,遠藤 春雄,0,9027321920
to_csv()にDataFrameを渡してCSVデータを出力しています。
メールアドレスの削除や6行目の追加などの加工が反映されたCSVが出力されているのがわかります。