pandas DataFrameからデータを抽出

スポンサーリンク
スポンサーリンク

pandasは、データ解析を容易にする機能を提供するPythonのデータ解析用ライブラリです。
データ分析や機械学習の前処理でよく利用されています。

ここでは、pandasのDataFrameからデータを抽出する方法について解説していきます。

DataFrameについてはこちらの記事を参照してください。
・参考記事:pandasでSeries・DataFrameの作成・変換

スポンサーリンク

使用ライブラリ

padasは外部ライブラリのため、インストールが必要です。

ライブラリ :pandas(公式ドキュメント
インストール:必要

ライブラリのインストール

pip で Pandas をインストールします。

 python -m pip install pandas

Successfully installed ・・・・と表示されればインストールは成功です。(依存関係のある他のライブラリも同時にインストールされます)

・関連記事:Pythonライブラリのインストール(pipの使い方)

ライブラリの読み込み

pandas を pd という名前でインポートします。
pd は広く使われていてスタンダードになっているので、この名前を利用する事をおすすめします。

使用データ

機械学習練習用によく利用されるタイタニック号の生存者データ(titanic.csv)を使用します。
データはdata.worldから入手できます。

titanic.csv

DataFrameの読み込み

ダウンロードしたcsvをDataFrameとして読み込みます。

 pandasオブジェクト.read_cav(ファイル名)

この例では 後述の head() メソッドで先頭5行を表示しています。

shape メソッドでサイズを確認できます。

指定した行数分のデータを表示する(head, tail)

DataFrameの先頭N行を表示するには head() メソッドを使用します。
引数に表示したい行数を入力して使用します。引数を空にするとデフォルトの5行分が表示されます。

先頭3行分を表示してみます。

pandas.head


DataFrameの最後尾を表示するには tail() メソッドを使用します。
こちらも引数に表示したい行数を入力します。デフォルトは5行になります。

最後尾3行分を表示してみます。

pandas.tail

特定の列を取得(列名, loc, iloc)

DataFrameから指定した列を取得

単一列のSeriesを取得(列名)

特定の列を取得するには [] で列名を指定します。

 DataFrame[列名]

結果はSeriesになります。

抽出したSeriesは、DataFrameが持っていたインデックスを引き継ぎ、Name属性も列名から設定されています。データ型は元のDataFrame列の型を引き継ぎます。

単一・複数列を取得(列名)

DataFrameとして抽出するには列名をリストで指定します。

 DataFrame[[列名1, 列名2, …]]

1列のみ取得する場合は、1列分のリストを指定します。

単一・複数列を取得(loc, iloc)

loc で行名を全体スライス(:)、列名をリストまたはスライスで指定すると全行を取得できます。

 DataFrame.loc[:, [列名1, 列名2, …]]
 DataFrame.loc[:, 開始列名:終了列名]

列が連続している場合は、スライス表記を使用できます。

結果は上記2つとも以下のようになります。


1列のみ取得する場合は、1列分のリストで指定します。


iloc は行番号を全体スライス(:)、列番号をリストまたはスライスで指定すると全行を取得できます。

 DataFrame.iloc[:, [列番号1, 列番号2, …]]
 DataFrame.iloc[:, 開始列番号:終了列番号]

iloc のスライスは、終点に指定した端点は含まれないため、終了位置+1で指定する必要があります。

特定の行を取得(行名, loc, iloc)

aFrameから特定の行を取得

単一・連続行を取得(行名)

特定の行を取得するには [] で行名をスライスで指定します。
スライスの終端に指定した行は取得されないため、取得したい行の次の行を終端に指定する必要があります。

 DataFrame[開始行名:終了行の次の行名]


1行のみ取得したい場合は、スライスの終端に開始行の次の行を指定します。

単一・複数行を取得(loc, iloc)

loc で行名を全体スライス(:)、列名をリストまたはスライスで指定すると全行を取得できます。

 DataFrame.loc[[行名1, 行名2, …], :]
 DataFrame.loc[開始行名:終了行名, :]

または

1行のみ取得する場合は、1行分のリストで指定します。



iloc は行番号をリストまたはスライス、列番号を全体スライス(:)で指定すると全列を取得できます。

 DataFrame.iloc[[行番号1, 行番号2, …], :]
 DataFrame.iloc[開始行番号:終了行番号+1, :]

iloc のスライスは、終点に指定した端点は含まれないため、終了位置+1で指定する必要があります。

特定の要素を取得(at, iat, loc, iloc)

データフレームから特定の要素を取得

atloc は、行名・列名を指定して要素を取得します。
iatiloc は、行番号・列番号を指定して要素を取得します。

atiatlociloc の違いに悩む場合は、iinteger(整数)の略で、番号を指定する方法と理解しておけば悩まずに済みます。

単独の要素を取得(at, iat)

at で行名、列名で要素の位置を指定して取得します。

 DataFrame.at[行名, 列名]


iat で行番号、列番号で要素の位置を指定して取得します。

 DataFrame.iat[行番号, 列番号]

後述の loc, iloc でも同じ処理が可能ですが、処理速度が at, iat の方が速いです。

単独・複数の要素を取得(loc, iloc)

loc は行名、列名で要素の位置を指定して取得します。

単独の要素は以下のように指定します。

 DataFrame.loc[行名, 列名]

連続した複数行・列を取得する場合は、スライス表記(開始位置:終了位置)で範囲を指定します。

 DataFrame.loc[<開始行名> :<終了行名>, <開始列名>:<終了列名>]

飛び地で要素を取得したい場合は、行名、列名をリストで指定します。

 DataFrame.loc[[行名1, 行名2, …], [列名1, 列名2, …]]


iloc は行番号、 列番号で要素の位置を指定して取得します。

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

連続した複数行・列を取得する場合は、スライス表記(開始位置:終了位置)で範囲を指定します。
ただし、iloc のスライス指定は、終点に指定した端点は含まれないため、終了位置を+1で指定する必要があります。

 DataFrame.iloc[開始行番号:終了行番号+1, 開始列番号:終了列番号+1]

飛び地で要素を取得したい場合は、行番号、列番号をリストで指定します。

 DataFrame.iloc[[行番号1, 行番号2, …], [列番号1, 列番号2, …]]

条件に一致する行を取得

条件に一致する行を取得

DataFrameの列に対して比較演算子で条件を指定すると、一致する行を取得することができます。
・関連記事:演算子-比較演算子

 DataFrame[DataFrame[列名] + 条件式]

次の例では sexmale の行を取得します。


loc の中で条件式を指定して、, の後に取得したい列名を指定することで必要な列のみ取得できます。

 DataFrame.loc[DataFrame[列名] + 条件式, [列名1, 列名2, …]]

次の例では age が35以上の行を抽出して name 列のデータを取得します。

複数条件に一致する行を取得(and, or)

複数条件に一致する行を取得

抽出する条件が複数ある場合は、and と or の演算子 & , | で条件式を結合します。

 DataFrame[ (DataFrame[列名] + 条件式1) & (DataFrame[列名] + 条件式2)]
 DataFrame[ (DataFrame[列名] + 条件式1) | (DataFrame[列名] + 条件式2)]

以下の例では35才以上の男性の行を抽出しています。


旅客クラス(pclass)2 または 3 の行を抽出します。

条件に一致する行を取得(isin)

条件に一致する行を取得

or 条件と同様に isin() メソッドも使用できます。

 DataFrame[ DataFrame[列名].isin(条件1, 条件2, …) ]

条件が1つの場合は、1要素のリストを指定します。


以下のコードで、or 条件と同じ結果が得られます。

特定の条件でデータ抽出する(query)

特定の条件でデータ抽出する

データ抽出は query メソッドを使用することもできます。query メソッドは SQL の WHERE のような関数です。

 DataFrame.query(条件式)

条件式は、全体をクォーテーションで囲い文字列で指定します。


条件式の値に文字列を指定する場合は、ダブルクオーテーション(””)で囲います。

複数の条件でデータ抽出する(query)

複数の条件でデータ抽出する

query メソッドで複数条件を指定する場合は、and, or をそのまま記述します。

 DataFrame.query(条件式1 and 条件式2)
 DataFrame.query(条件式1 or 条件式2)


pandasでExcelを扱う方法は以下の記事を参考にしてください。
・関連記事:pandasでExcelファイルの読み込み(read_excel)
・関連記事:pandasでExcelファイルの書き込み(to_excel)