note.nkmk.me

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

Posted: 2018-03-11 / Modified: 2021-04-01 / Tags: Python, pandas

pandas.DataFrame, Seriesから、行名(インデックス名、index)・列名(カラム名、columns)が特定の条件を満たす行・列を抽出(選択)するにはfilter()メソッドを使う。

ここでは、以下の内容について説明する。

  • pandas.DataFrame.filter()の基本的な使い方
    • 行・列を指定: 引数axis
  • 行名・列名が完全一致する行・列を抽出: 引数items
  • 行名・列名が部分一致する行・列を抽出: 引数like
  • 行名・列名を正規表現で選択して行・列を抽出: 引数regex
  • pandas.Seriesの場合

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

pandasにおける行・列の選択の基本については以下の記事を参照。

以下のpandas.DataFrameを例とする。

import pandas as pd

print(pd.__version__)
# 1.2.2

df = pd.DataFrame([[0, 1, 2], [3, 4, 5], [6, 7, 8]],
                  index=['apple', 'banana', 'pineapple'],
                  columns=['A', 'B', 'C'])
print(df)
#            A  B  C
# apple      0  1  2
# banana     3  4  5
# pineapple  6  7  8
スポンサーリンク

pandas.DataFrame.filter()の基本的な使い方

pandas.DataFramefilter()メソッドで条件を満たす行名・列名の行・列を抽出できる。

引数items, like, regexで条件を指定する。これらの引数を同時に指定するとエラー。それぞれの詳細に付いては後述。

print(df.filter(items=['A', 'C']))
#            A  C
# apple      0  2
# banana     3  5
# pineapple  6  8

# print(df.filter(items=['A', 'C'], like='A'))
# TypeError: Keyword arguments `items`, `like`, or `regex` are mutually exclusive

条件を満たす行・列が存在しない場合は空のpandas.DataFrameが返される。エラーにはならない。

print(df.filter(items=['X']))
# Empty DataFrame
# Columns: []
# Index: [apple, banana, pineapple]

行・列を指定: 引数axis

行・列どちらを対象とするかは引数axisで指定する。0または'index'で行、1またはcolumnsで列が対象となる。

print(df.filter(items=['apple', 'pineapple'], axis=0))
#            A  B  C
# apple      0  1  2
# pineapple  6  7  8

print(df.filter(items=['apple', 'pineapple'], axis='index'))
#            A  B  C
# apple      0  1  2
# pineapple  6  7  8

print(df.filter(items=['A', 'C'], axis=1))
#            A  C
# apple      0  2
# banana     3  5
# pineapple  6  8

print(df.filter(items=['A', 'C'], axis='columns'))
#            A  C
# apple      0  2
# banana     3  5
# pineapple  6  8

省略した場合は列が対象となる。

print(df.filter(items=['A', 'C']))
#            A  C
# apple      0  2
# banana     3  5
# pineapple  6  8

行・列に対して同時に条件を指定することはできない。行・列両方を対象としたい場合はfilter()を繰り返す。

print(df.filter(items=['A', 'C']).filter(items=['apple', 'pineapple'], axis=0))
#            A  C
# apple      0  2
# pineapple  6  8

行名・列名が完全一致する行・列を抽出: 引数items

行名・列名が完全一致する行・列を抽出するには、引数itemsにリストを指定する。結果の行・列の順番は指定したリストの順番となる。元の順番ではないので注意。

print(df.filter(items=['A', 'C']))
#            A  C
# apple      0  2
# banana     3  5
# pineapple  6  8

print(df.filter(items=['C', 'A']))
#            C  A
# apple      2  0
# banana     5  3
# pineapple  8  6

同様の処理はインデックス参照やilocでリストを指定することでも実現可能。結果が指定したリストの順番となるのも同じ。

print(df[['C', 'A']])
#            C  A
# apple      2  0
# banana     5  3
# pineapple  8  6

print(df.loc[:, ['C', 'A']])
#            C  A
# apple      2  0
# banana     5  3
# pineapple  8  6

print(df.loc[['pineapple', 'apple']])
#            A  B  C
# pineapple  6  7  8
# apple      0  1  2

行名・列名が部分一致する行・列を抽出: 引数like

行名・列名が部分一致する(〜を含む)行・列を抽出するには、引数likeに文字列を指定する。

print(df.filter(like='apple', axis=0))
#            A  B  C
# apple      0  1  2
# pineapple  6  7  8

引数like、各行名・列名labelとするとlike in label == Trueとなる行・列が抽出される。

複数条件を指定したい場合は次に述べる正規表現を使う。

行名・列名を正規表現で選択して行・列を抽出: 引数regex

行名・列名を正規表現で選択して行・列を抽出するには、引数regexに正規表現パターンを文字列で指定する。

正規表現の特殊文字などについては以下を参照。

行名が'e'で終わる行を抽出。

print(df.filter(regex='e$', axis=0))
#            A  B  C
# apple      0  1  2
# pineapple  6  7  8

行名が'a'または'b'で始まる行を抽出。

print(df.filter(regex='^(a|b)', axis=0))
#         A  B  C
# apple   0  1  2
# banana  3  4  5

行名が'na'または'ne'を含む行を抽出。

print(df.filter(regex='(na|ne)', axis=0))
#            A  B  C
# banana     3  4  5
# pineapple  6  7  8

なお、内部では、re.search()で行名・列名を検索してマッチする場所があればその行・列を抽出するという実装になっている(pandas1.2.3時点)。

pandas.Seriesの場合

pandas.Seriesでもfilter()メソッドが提供されている。使い方はpandas.DataFrameと同じ。

s = pd.Series([0, 1, 2], index=['apple', 'banana', 'pineapple'])
print(s)
# apple        0
# banana       1
# pineapple    2
# dtype: int64

print(s.filter(items=['pineapple', 'banana']))
# pineapple    2
# banana       1
# dtype: int64

print(s.filter(like='apple'))
# apple        0
# pineapple    2
# dtype: int64

print(s.filter(regex='^(a|b)'))
# apple     0
# banana    1
# dtype: int64
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事