pandasは、データ解析を容易にする機能を提供するPythonのデータ解析用ライブラリです。
データ分析や機械学習の前処理でよく利用されています。
ここでは、pandasのDataFrameからデータを抽出する方法について解説していきます。
DataFrameについてはこちらの記事を参照してください。
・参考記事:pandasでSeries・DataFrameの作成・変換
使用ライブラリ
padasは外部ライブラリのため、インストールが必要です。
インストール:必要
ライブラリのインストール
pip で Pandas をインストールします。
Successfully installed ・・・・と表示されればインストールは成功です。(依存関係のある他のライブラリも同時にインストールされます)
・関連記事:Pythonライブラリのインストール(pipの使い方)
ライブラリの読み込み
pandas を pd
という名前でインポートします。pd
は広く使われていてスタンダードになっているので、この名前を利用する事をおすすめします。
1 | import pandas as pd |
使用データ
機械学習練習用によく利用されるタイタニック号の生存者データ(titanic.csv)を使用します。
データはdata.worldから入手できます。
DataFrameの読み込み
ダウンロードしたcsvをDataFrameとして読み込みます。
1 2 | titanic = pd.read_csv('titanic.csv') titanic.head() |
この例では 後述の head()
メソッドで先頭5行を表示しています。
shape
メソッドでサイズを確認できます。
1 2 | titanic.shape # (1310, 14) |
指定した行数分のデータを表示する(head, tail)
DataFrameの先頭N行を表示するには head()
メソッドを使用します。
引数に表示したい行数を入力して使用します。引数を空にするとデフォルトの5行分が表示されます。
先頭3行分を表示してみます。
1 | df.head(3) |
DataFrameの最後尾を表示するには tail()
メソッドを使用します。
こちらも引数に表示したい行数を入力します。デフォルトは5行になります。
最後尾3行分を表示してみます。
1 | df.tail(3) |
特定の列を取得(列名, loc, iloc)
単一列のSeriesを取得(列名)
特定の列を取得するには []
で列名を指定します。
1 2 | ages = titanic['age'] ages.head() |
結果はSeriesになります。
抽出したSeriesは、DataFrameが持っていたインデックスを引き継ぎ、Name属性も列名から設定されています。データ型は元のDataFrame列の型を引き継ぎます。
単一・複数列を取得(列名)
DataFrameとして抽出するには列名をリストで指定します。
1 | titanic[['name', 'sex', 'age']] |
1列のみ取得する場合は、1列分のリストを指定します。
1 | titanic[['name']] |
単一・複数列を取得(loc, iloc)
loc
で行名を全体スライス(:
)、列名をリストまたはスライスで指定すると全行を取得できます。
DataFrame.loc[:, 開始列名:終了列名]
1 | titanic.loc[:, ['name', 'sex', 'age']] |
列が連続している場合は、スライス表記を使用できます。
1 | titanic.loc[:, 'name':'age'] |
結果は上記2つとも以下のようになります。
1列のみ取得する場合は、1列分のリストで指定します。
1 | titanic.loc[:, ['name']] |
iloc
は行番号を全体スライス(:
)、列番号をリストまたはスライスで指定すると全行を取得できます。
DataFrame.iloc[:, 開始列番号:終了列番号]
1 | titanic.iloc[:, [2,3,4]] |
iloc
のスライスは、終点に指定した端点は含まれないため、終了位置+1で指定する必要があります。
1 | titanic.iloc[:, 2:5] |
特定の行を取得(行名, loc, iloc)
単一・連続行を取得(行名)
特定の行を取得するには []
で行名をスライスで指定します。
スライスの終端に指定した行は取得されないため、取得したい行の次の行を終端に指定する必要があります。
1 | titanic[2:5] |
1行のみ取得したい場合は、スライスの終端に開始行の次の行を指定します。
1 | titanic[2:3] |
単一・複数行を取得(loc, iloc)
loc
で行名を全体スライス(:
)、列名をリストまたはスライスで指定すると全行を取得できます。
DataFrame.loc[開始行名:終了行名, :]
1 | titanic.loc[[2,3,4], :] |
または
1 | titanic.loc[2:4, :] |
1行のみ取得する場合は、1行分のリストで指定します。
1 | titanic.loc[[2], :] |
iloc
は行番号をリストまたはスライス、列番号を全体スライス(:)で指定すると全列を取得できます。
DataFrame.iloc[開始行番号:終了行番号+1, :]
1 | titanic.iloc[[2,3,4], :] |
iloc
のスライスは、終点に指定した端点は含まれないため、終了位置+1で指定する必要があります。
1 | titanic.iloc[2:5, :] |
特定の要素を取得(at, iat, loc, iloc)
at
と loc
は、行名・列名を指定して要素を取得します。iat
と iloc
は、行番号・列番号を指定して要素を取得します。
at
と iat
、loc
と iloc
の違いに悩む場合は、i
は integer(整数)の略で、番号を指定する方法と理解しておけば悩まずに済みます。
単独の要素を取得(at, iat)
at
で行名、列名で要素の位置を指定して取得します。
1 2 | titanic.at[2, 'name'] # 'Allison, Miss. Helen Loraine' |
iat
で行番号、列番号で要素の位置を指定して取得します。
1 2 | titanic.iat[2, 2] # 'Allison, Miss. Helen Loraine' |
後述の loc
, iloc
でも同じ処理が可能ですが、処理速度が at
, iat
の方が速いです。
単独・複数の要素を取得(loc, iloc)
loc
は行名、列名で要素の位置を指定して取得します。
単独の要素は以下のように指定します。
1 2 | titanic.loc[2, 'name'] # 'Allison, Miss. Helen Loraine' |
連続した複数行・列を取得する場合は、スライス表記(開始位置:終了位置)で範囲を指定します。
1 | titanic.loc[0:2, 'name':'age'] |
飛び地で要素を取得したい場合は、行名、列名をリストで指定します。
1 | titanic.loc[[0, 2],['name', 'age']] |
iloc
は行番号、 列番号で要素の位置を指定して取得します。
1 2 | titanic.iloc[2, 2] # 'Allison, Miss. Helen Loraine' |
連続した複数行・列を取得する場合は、スライス表記(開始位置:終了位置)で範囲を指定します。
ただし、iloc
のスライス指定は、終点に指定した端点は含まれないため、終了位置を+1で指定する必要があります。
1 | titanic.iloc[0:3, 2:5] |
飛び地で要素を取得したい場合は、行番号、列番号をリストで指定します。
1 | titanic.iloc[[0, 2],[2, 4]] |
条件に一致する行を取得
DataFrameの列に対して比較演算子で条件を指定すると、一致する行を取得することができます。
・関連記事:演算子-比較演算子
次の例では sex
が male
の行を取得します。
1 | titanic[titanic['sex'] == 'male'] |
loc
の中で条件式を指定して、,
の後に取得したい列名を指定することで必要な列のみ取得できます。
次の例では age
が35以上の行を抽出して name
列のデータを取得します。
1 | titanic.loc[titanic['age'] > 35, ['name']] |
複数条件に一致する行を取得(and, or)
抽出する条件が複数ある場合は、and と or の演算子 &
, |
で条件式を結合します。
DataFrame[ (DataFrame[列名] + 条件式1) | (DataFrame[列名] + 条件式2)]
以下の例では35才以上の男性の行を抽出しています。
1 | titanic[(titanic['sex'] == 'male') & (titanic['age'] >= 35)] |
旅客クラス(pclass)2 または 3 の行を抽出します。
1 | titanic[(titanic['pclass'] == 2) | (titanic['pclass'] == 3)] |
条件に一致する行を取得(isin)
or 条件と同様に isin()
メソッドも使用できます。
条件が1つの場合は、1要素のリストを指定します。
1 | titanic[titanic['sex'].isin(['male'])] |
以下のコードで、or 条件と同じ結果が得られます。
1 | titanic[titanic['pclass'].isin([2, 3])] |
特定の条件でデータ抽出する(query)
データ抽出は query
メソッドを使用することもできます。query
メソッドは SQL の WHERE のような関数です。
条件式は、全体をクォーテーションで囲い文字列で指定します。
1 | titanic.query('age > 35') |
条件式の値に文字列を指定する場合は、ダブルクオーテーション(””)で囲います。
1 | titanic.query('sex == "male"') |
複数の条件でデータ抽出する(query)
query メソッドで複数条件を指定する場合は、and
, or
をそのまま記述します。
DataFrame.query(条件式1 or 条件式2)
1 | titanic.query('sex == "male" and age > 35') |
1 | titanic.query('pclass == 2 or pclass == 3') |
pandasでExcelを扱う方法は以下の記事を参考にしてください。
・関連記事:pandasでExcelファイルの読み込み(read_excel)
・関連記事:pandasでExcelファイルの書き込み(to_excel)