【Pandas】DataFrame操作のチートシート

Pandasはデータ処理に関して多彩な機能を提供しているライブラリで、データ分析や機械学習に関わる人には必須のツールです。

Pandasでできることは多すぎて、全てを網羅することが難しいですが、よく使う操作やこれは知っておいた方がいいという知識をまとめてチートシートを作成しました。

人によってはこんなの使わないとか、あの操作がないやんとかあると思いますが、あくまで個人的主観で作成したものなので、その辺りはご承知おきください。

各メソッドについて詳細までは載せていないので、あくまでチートシートとして活用ください。

場合によっては、後日アップデートもしていきたいと思っています。

Pythonでデータサイエンスするなら

Pythonでデータサイエンスをするなら、以下の書籍がおすすめです。Pandas、matplotlib、Numpy、scikit-learnといったデータサイエンスに必要なライブラリを、体系立てて一通り学ぶことができます。

ややお値段高めですが、これ1冊で十分という内容・ボリュームなので、損はしないと思います^^

今回使用するDataFrame

今回もボストンの住宅価格データセットを例に各種メソッドをまとめていきます。

ボストンの住宅価格データセット

基本情報確認

まずはDataFrameの各種情報を取得するためのメソッド

行列のデータ数を確認(df.shape)

df.shape

(行数、列数)で値が返される。

df.shape

インデックスの確認(df.index)

df.index

DataFrameのインデックスに関する情報が(始値、終値、階差)の順で返される。階差はこの場合、インデックスが1ずつ増加していくことを示す。

df.index

各値を取得したい場合は以下のようにする

  • df.index.start
  • df.index.stop
  • df.index.step
df.index.start  df.index.stop  df.index.step

列名一覧取得(df.columns)

df.columns

df.columns

各列のデータ型(df.dtypes)

df.dtypes

df.dtypes

ある列のユニークな値(df[xxx].unique())

df[xxx].unique()

Seriesでしか使えないので、特定の列を指定する必要がある。

df["ZN"].unique()

ユニークな値の個数をカウントしたい場合は、len()で括る

len(df["ZN"].unique())

欠損値の確認(df.isnull())

df.isnull()

各行のそれぞれの列で欠損があるかどうかがTrue/Falseで返される。

df.isnull()

各列でそれぞれ欠損値がいくつあるかを調べる際は、df.isnull().sum()とする。ここでは、isnull()がTrueの場合をカウントしている。

df.isnull().sum()

要約統計量(df.describe())

df.describe()

各列(数値列)の平均や標準偏差といった統計量がDataFrameとして返される。

各種統計量

データ整形系

インデックスを設定(df.set_index())

df.set_index(設定する値, inplace=True/False, drop=True/False)

指定した列をインデックスとして設定できる。外部の配列でも可能。その際、データ数が一致している必要がある。

inplaceはもとのDataFrameそのものを修正するかどうか。デフォルトはFalse。dropはインデックスに指定した列を削除するかどうか。デフォルトはTrue。

df.set_index("ZN", inplace=True, drop=True)

インデックスの振り直し(reset_index())

df.reset_index(inplace=True, drop=True)

インデックスをリセットし、0からの連番を振りなおす。

inplaceはもとのDataFrameそのものを修正するかどうか。デフォルトはFalse。 デフォルトではリセット前のインデックスが新規列としてDataFrameに追加されるが、drop=Trueとすると追加されなくなる。

df.reset_index(inplace=True, drop=True)

列名の変更(df.rename())

df.rename(columns={“旧名” : “新名}, inplace=Ture/False)

辞書型で記述すれば、複数の列名をまとめて変更することも可能。

inplaceはもとのDataFrameそのものを修正するかどうか。デフォルトはFalse。

df.rename(columns={"ZN":"XXX", "RAD":"YYY"}, inplace=True)

ソート(df.sort_values())

df.sort_values(by=”列名”, ascending=True/False)

指定した列を基準にソーティングを行う。

ascending=True とすることで降順に並びかえることも可能。デフォルトはFalse。

df.sort_values(by="ZN", ascending=True)

時間系の処理

ボストンの住宅価格データセットに時間データがないので、適当につくってインデックスにぶちこみました。

時間列を作成しインデックスに設定

datetime型へ変換(pd.to_datetime())

pd.to_datetime(値, errors={“ignore”, “raise”, “coerce”}, format=”xxxx”)

datetime型に変換できる値であればそのままぶちこむだけで変換可能。

errorsでは、変換エラーが起きた際の処理を指定する。

“ignore”変換不可であれば元の値を返す
“raise”例外を投げる
“coerce”変換不可であればNaTを返す

formatでは、変換する値のformatを指定する。指定しなくても変換できるが、動的変換となるため処理が遅くなる。

formatの一覧

https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior

pd.to_datetime(df.index,errors="ignore", format="%Y-%m-%d")

時間単位で集計(df.resample())

df.resample(集計ルール)

集計ルールは大体以下の通り

指定方法内容区切りタイミング
AS年初
A年末
MS月初
M月末
W日曜
D0時
H0分
T0秒
S

df.resample()ではオブジェクトが返され、平均や合計を取得することができる。

処理内容
min最小
max最大
sum合計
mean平均
first最初の値
df.resample("MS").mean()

値の置換(df.replace())

df.replace(変換前の値, 変換後の値)

0を10に変換する場合

df["ZN"].replace(0, 10)

文字列も可能

値の削除(df.drop())

df.drop(削除対象)

df.drop("ZN", axis=1)

複数選択したい場合は配列で指定する。index=で指定することも可能。

df.drop(index=[1,3])

条件に応じて値の代入(df.mask())

df.mask(条件, 代入する値)

代入する値を指定しないと、NaNが代入される。DataFrame全体でmaskすると、該当行すべての列で指定値が代入される。

 df.mask(df["ZN"]==0, 100)

欠損値の処理

欠損値の補完(df.fillna())

df.fillna(value={対象列名 : 埋める値}, method=”xxx”)

すべての欠損値を0で埋める場合

df.fillna(0)

valueで指定する場合、辞書型({対象列名:値})で指定する。列ごとに埋める値を変えたい場合に有効。

df.fillna(value={"ZN":1, "RAD":"--"})

前後の値を使って埋める場合はmethodで指定する。”ffill”では欠損値の前の値で置き換えられ、”bfill”では後ろの値で置き換えられる。時系列データでよく使われる。

df.fillna(method="ffill")

欠損値の削除(df.dropna())

df.dropna()

how=”all”ですべてが欠損値の行(列)を、how=”any”で1つでも欠損値がある行(列)を削除する。

デフォルトでは行が、axis=1で列が対象。

df.dropna(how="any", axis=1)

欠損値ではない要素の数がx個以上の場合に行(列)を削除する場合はthreshを用いる。

欠損でない要素が2つ未満の行を削除する場合は以下(列の場合はaxis=1)

df.dropna(thresh=2)

特定の行列を基準にする場合、subsetで指定する。

列を指定すると、その列で欠損のある行が削除される。行を指定すると、その行で欠損のある列が削除される。

df.dropna(subset=["ZN", "RAD"])

howとの併用も可能。以下では、指定した列すべてが欠損の行を削除する

df.dropna(subset=["ZN", "RAD"], how="all")

データ集計系

列の集計(df[xxx].value_counts())

df[xxx].value_counts()

指定した列の要素の個数がカウントされる。

 df["RAD"].value_counts()

集約(df.groupby())

df.groupby(列名)

集約した後に平均や合計を出せる。2つ以上の列を指定してもよい。

mean()平均
sum()合計
max()最大値
min()最小値
size()件数
df.groupby(["RAD"]).mean()

データ抽出系

列で抽出(df[[“xxx”]])

df[[“xxx”]]

指定列をDataFrameとして取り出せる。一重の[ ]にすると配列として取得する。

df[["RAD", "ZN"]]

ラベルで指定して抽出(df.loc)

df.loc[行, 列]

インデックスと列名で指定して抽出する。全件選択は:のみで可能。

df.loc[1, "ZN":"B"]  df.loc[:, "ZN":"B"]

行・列番号を指定して抽出(df.iloc)

df.iloc[行番号, 列番号]

df.iloc[4,3]  df.iloc[4,3:]  df.iloc[4:50:5,3:]

データ結合系

DataFrame、Seriesの連結(pd.concat())

pd.concat(連結対象, axis=xx, join=xx)

3つ以上のDataFrame(Series)もまとめて連結可能。

axis=1で横方向に連結。デフォルトは縦方向。

joinでは結合方法を指定する。内部結合は”inner”、外部結合は”outer”。

pd.concat([df, df1, df2], axis=1, join="inner")

行の追加(df.append())

df.append(追加要素)

df.append(df1)

DataFrameの結合(df.merge())

df.mearge(結合対象, on=xx, how=xx)

on / left_on / right_onでキーとなる列を指定する。

howは結合方法を指定する。

inner内部結合
left左結合
right右結合
outer外部結合

インデックスをキーにする場合は left_index / right_index (True or False)

df.merge(df2, on="RAD", how="outer")df.merge(df2, right_index=True, how="left")

まとめ

いろんなメソッドまとめすぎてまとまりはありませんが、ちょっと忘れたときのチートシートとして活用していただければと思います^^

ではでは👋