Python モジュール: pandas
概要
- Python のデータフレームモジュール
- データフレームとは、複数のデータ型が入り交じるデータ集合を 1 つのデータセットでまとめたもの
- リストやディクショナリ型でも対応は可能だが、例えば 1 原子に様々なパラメータ (座標や原子名、原子量などなど) が加わると、
- データへのアクセスの仕方が難しくなる
- ソートが難しい
- プログラム言語にもよるが、リストやディクショナリでは特定の型のデータしか格納できない
- 内部のデータを確認する際に、for 文などで取り出して整形しないと見づらい
- データフレームでは、自動で整形やソートの際の煩雑な作業をしてくれるのでデータ処理が楽になる。
使い方
インストール
$ sudo pip3 install pandas
モジュールの読み込み
import pandas
あるいは
import pandas as pd
as pdによって、以降pdで呼び出せる。- ここではこっちの読み込みをした場合で記述していく。
データフレームの作成
data_frame = \ pd.DataFrame([ ["Tanaka", "Suzuki", "Yamada"], [59, 20, 31], [150, 160, 159] ]).T data_frame.columns = ["Name", "Age", "Height"] data_frame.index = [1,2,3]
.T: numpy の転置と同じ (pandas では、行を個々のデータ、列をデータの種類としているため、転置を使っている)data_frame.columnsで、各リストのデータ名 (カラム名) を上書きするdata_frame.indexで、各リストのインデックス (シリアル ID) を上書きする- インデックスは数値でないといけない
データフレームへのアクセス
- カラム、インデックスへのアクセス
print(data_frame.columns) print(data_frame.index)
- `data_frame.columns` でカラム一覧にアクセス
- `data_frame.index` でインデックス一覧にアクセス
- データへのアクセス
- 単一カラムへのアクセス
print(data_frame["Name"])
- 複数カラムへのアクセス
print(data_frame[["Name", "Age"]])
- リストでカラム名を指定する
- 行へのアクセス
print(data_frame[1:2])
- スライスで必ず、始点と終点を指定する
- カラムと同時に指定する場合は、カラム、行の順番で。
データの追加
- カラムの追加
data_frame[NEW_COLUMN] = [DATA1, DATA2, DATA3, ...]
NEW_COLUMN: 新しく追加するカラム名DATA1, DATA2, …: 追加するデータはリストで渡す- 次元が合わない場合は、エラーになる
- 参考サイト: pandasの基本操作 - Qiita
- 行の追加
data_frame = data_frame.append(DATA_FRAME)
DATA_FRAME: 追加するデータが入った pandas のデータフレーム- 次元が合わない場合は、
NaNとなる。 - 返り値を受け取る形で更新する。
- 参考サイト: pandasの基本操作 - Qiita
- データフレームの追加
- 横に結合 (カラムの追加)
DATA_FRAME = pd.concat([DATA_FRAME1, DATA_FRAME2, ...], axis = 1)
- 縦に結合 (行の追加)
DATA_FRAME = pd.concat([DATA_FRAME1, DATA_FRAME2, ...])
- データの欠損は
NaN扱いとなる。NaNを置換するには.fillna()を使う。
DATA_FRAME.fillna("")
- 上記の例では、
NaNが空の文字列に置換される。
値の取得・変更
- 行ラベルと列ラベルで指定した値を取得
DF.at[ROW_LABEL, COL_LABEL]
DF: データフレーム変数ROW_LABEL: 行ラベルCOL_LABEL: 列ラベル
- 行ラベルと列ラベルで指定した値を変更
DF.at[ROW_LABEL, COL_LABEL] = VALUE
DF: データフレーム変数ROW_LABEL: 行ラベルCOL_LABEL: 列ラベルVALUE: 新しい値
- 行番号と列番号で指定した値を取得
DF.iat[ROW_INDEX, COL_INDEX]
DF: データフレーム変数ROW_INDEX: 行番号COL_INDEX: 列番号
- 行番号と列番号で指定した値を変更
DF.iat[ROW_INDEX, COL_INDEX] = VALUE
DF: データフレーム変数ROW_INDEX: 行番号COL_INDEX: 列番号VALUE: 新しい値
データフレームのサイズ確認
- 2 つの方法がある。
.indexや.columnsで取得したカラム名やインデックス名のリストをlen()を使って取得する。DATA_FRAME.shapeでインデックスとカラム数を同時に取得する。
ファイルの読み込み
- テキストファイルの場合
DF = pd.read_table("INPUT.txt", names = [LABEL1, LABEL2, ...])
DF: データフレームを格納する変数INPUT.txt: 入力ファイルLABEL1, LABEL2,…: カラム名
CSV ファイルの読み書き
- 読み込み
DF = pd.read_csv(CSV_FILE[, OPTION])
DF: データフレームを格納する変数CSV_FILE: CSV ファイルのパスOPTION: その他のオプション (任意)- この場合、1 行目が列ラベルとして割り当てられる。
- 列ラベルの指定方法
- 1 行目をラベルとして割り当てたくない場合は、
OPTIONにheader = Noneを指定する。 - 任意の列ラベルを指定する場合は、
OPTIONにname = (LABEL1, LABEL2, …)を付け、LABEL1やLABEL2に列ラベルを指定していく。 - 特定の行を列ラベルとして指定する場合は、
OPTIONにheader = NUMのNUMに行番号 (0 から始まる) を指定する。この場合、指定した行より上の行は無視される。
- 行ラベルの指定方法
- 特定の列を行ラベルを指定する場合は、
OPTIONにindex_col = NUMのNUMに列番号 (0 から始まる) を指定する。
- 書き出し
DF.to_csv(CSV_FILE[, OPTION])
DF: データフレームが格納された変数CSV_FILE: 出力する CSV ファイルのパスOPTION: その他のオプション (任意)- 特定の列のみを書き出す場合、
OPTIONにcolumns = [LABEL1, LABEL2, …]を追加し、LABEL1やLABEL2に書き出す列ラベルを指定していく。 - 列ラベルや行ラベルも書き出す場合は、
OPTIONにheader(列ラベル) やindex(行ラベル) を追加し、TRUEやFALSEで ON/OFF を切り替える。デフォルトは両方True - 区切り文字を指定する場合は、
OPTIONにsep = SEPを追加し、SEPに区切り文字を指定する。SEPに\tを指定すると、TSV 形式のファイルで出力できる。
- 参考サイト: