note.nkmk.me

pandas.DataFrameから条件を満たす行名・列名の行・列を抽出(選択)

Date: 2018-03-11 / Modified: 2018-05-23 / tags: Python, pandas
このエントリーをはてなブックマークに追加

pandas.DataFrameから、行名(インデックス名)・列名(カラム名)の文字列が特定の条件を満たす行または列を抽出(選択)する。

行名・列名ではなく要素が特定の文字列を含む行を抽出する方法については以下の記事を参照。

基本的にやり方は同じで、pandasの文字列メソッドを利用してboolの配列を取得し、それを用いてブールインデックス参照で行または列を抽出する。

pandasの文字列メソッドには以下の関数がある。

  • str.contains(): 特定の文字列を含む
  • str.endswith(): 特定の文字列で終わる
  • str.startswith(): 特定の文字列で始まる
  • str.match(): 正規表現のパターンに一致する

ここでは、

  • 条件を満たす行名の行を抽出
    • query()を使う
  • 条件を満たす列名の列を抽出
  • 条件を満たす行名・列名の要素を抽出

について、サンプルコードとともに説明する。

例として、以下のデータを使用する。

import pandas as pd

df = pd.read_csv('data/src/sample_pandas_normal.csv', index_col=0)
print(df)
#          age state  point
# name                     
# Alice     24    NY     64
# Bob       42    CA     92
# Charlie   18    CA     70
# Dave      68    TX     70
# Ellen     24    CA     88
# Frank     30    NY     57

サンプルのcsvファイルはコチラ。

スポンサーリンク

条件を満たす行名の行を抽出

index属性で取得できるindexオブジェクトに対し、文字列メソッドを適用する。

print(df.index)
# Index(['Alice', 'Bob', 'Charlie', 'Dave', 'Ellen', 'Frank'], dtype='object', name='name')

print(df.index.str.contains('li'))
# [ True False  True False False False]

得られたboolの配列で行を参照する。

print(df[df.index.str.contains('li')])
#          age state  point
# name                     
# Alice     24    NY     64
# Charlie   18    CA     70

ほかの文字列メソッドでもやり方は同じ。

print(df.index.str.endswith('e'))
# [ True False  True  True False False]

print(df[df.index.str.endswith('e')])
#          age state  point
# name                     
# Alice     24    NY     64
# Charlie   18    CA     70
# Dave      68    TX     70

query()を使う

indexの条件指定はquery()メソッドでもできる。

query()メソッドの詳細は以下の記事を参照。

numexprがインストールされている場合、引数engine='python'を指定する必要がある(numexprのバージョン2.6.5、pandasのバージョン0.23.0)。

index列はindexでもindex列の名前(例の場合はname)でもどちらでも指定可能。

print(df.query('index.str.contains("li")', engine='python'))
#          age state  point
# name                     
# Alice     24    NY     64
# Charlie   18    CA     70

print(df.query('name.str.endswith("e")', engine='python'))
#          age state  point
# name                     
# Alice     24    NY     64
# Charlie   18    CA     70
# Dave      68    TX     70

条件を満たす列名の列を抽出

列名の場合は、columns属性で取得できるindexオブジェクトに対し、文字列メソッドを適用する。

print(df.columns)
# Index(['age', 'state', 'point'], dtype='object')

print(df.columns.str.endswith('e'))
# [ True  True False]

列に対するブールインデックス参照はloc[:. bool配列]とする。

列名・行名で位置を指定するのがloc、行番号・列番号で位置を指定するのがilocだが、ブールインデックス参照の場合はloc,でもilocでもどちらでも可。

print(df.loc[:, df.columns.str.endswith('e')])
#          age state
# name              
# Alice     24    NY
# Bob       42    CA
# Charlie   18    CA
# Dave      68    TX
# Ellen     24    CA
# Frank     30    NY

print(df.iloc[:, df.columns.str.endswith('e')])
#          age state
# name              
# Alice     24    NY
# Bob       42    CA
# Charlie   18    CA
# Dave      68    TX
# Ellen     24    CA
# Frank     30    NY

loc, ilocについての詳細は以下の記事を参照。

条件を満たす行名・列名の要素を抽出

行名と列名、両方に対して条件を指定することもできる。

indexcolumnsに対して所望の文字列メソッドを適用し、locまたはilocでブールインデックス参照する。

print(df.loc[df.index.str.contains('li'), df.columns.str.endswith('e')])
#          age state
# name              
# Alice     24    NY
# Charlie   18    CA
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事