YutaKaのPython教室

Python の文法やライブラリ、API、環境構築について画像・動画・ソースコード付きで徹底解説!

pandas 行名・列名からデータ抽出|条件を満たすラベル指定

データ分析では、特定の行・列のデータを抽出することがよくあります。

しかし、pandasは抽出方法が柔軟すぎて、逆に抽出方法がわからなくなってしまうことも…。

そこで、この記事ではラベルからのデータ抽出について、次の内容をわかりやすく解説します!

  1. 行名・列名を指定してデータを抽出する方法は?
  2. 特定の文字を含んでいる行・列を抽出する方法は?
  3. 正規表現で複雑な条件を設定する方法は?

ラベルからのデータ抽出ができるようになると、DataFrameの操作がぐっと楽になります!

行名・列名からのデータ抽出まとめ

行名・列名(以下、まとめてラベル名と呼称)からのデータ抽出には、主に次のパターンがあります。

  • 特定のラベル名を指定する
  • ラベル名が…
    • 特定のラベル候補のどれかに当てはまる
    • 特定の文字列を含む
    • 特定の文字列で始まる/終わる
  • 正規表現で複雑な条件を指定する

これらのラベル名をもとにしたデータ抽出は、次の2つの抽出方法があります。

  1. df.loc[条件]で適切な条件を与える
  2. df.filter()メソッドで抽出する

以下の表に、df.loc[]の条件, .filter()の引数を抽出方法ごとに整理しています。

条件 df.loc[条件]の条件 df.filter()メソッドの引数
特定のラベル名 df.loc[インデックス名] or
df.loc[:, カラム名]
items=["ラベル名"]
ラベル候補から抽出 df.index.isin(["ラベル候補"]) items=["ラベル候補"]
ある文字を含む df.index.str.contains("文字列") like="文字列"
ある文字で始まる df.index.str.startswith("文字列") regex="^文字列"
ある文字を終わる df.index.str.endswith("文字列") regex="文字列$"
正規表現で条件指定 df.index.str.contains("正規表現") regex="正規表現"

特定のラベル名を指定する場合は、.loc[]の方が簡単ですが、それ以外では.filter()を使った方が簡単そうです。

私の中の使い分けのイメージは、次の画像の通りです。

サンプルコードを見ながら、好みの方法を選んでみてください。

  • 【参考】DataFrameにインデックスを設定する方法については、次の記事で解説しています。
≫pandas DataFrameにインデックス設定|パターン別にわかりやすく解説
pandasのDataFrameでは、インデックス名でデータにアクセスします。しかし、DataFrameへのインデックス指定方法は少しわかりにくい部分も…。そこで、この記事では、パターン別に設定方法を解説!①DataFrame作成時にインデックス列指定、②既存DataFrameで指定、③ExcelやCSVから読み込み時に指定 ④インデックスの振り直し…
www.yutaka-note.com/entry/pandas_index_setting
 

行抽出・列抽出の選択

インデックス、カラムどちらで抽出するかは、df.loc[]df.filter()それぞれ次のように指定します。

  • インデックスで行を抽出:
    • df.loc[条件]
    • df.filter(各引数, axis=0)
  • カラムで列を抽出:
    • df.loc[:, 条件]
    • df.filter(各引数, axis=1)

以下では、次のサンプルデータを用いて、各種抽出方法を紹介していきます。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.arange(18).reshape(6,3),
                  index=pd.Index(['Itou', 'Kudou', 'Naitou', 'Saitou', 'Satou', 'Suzuki'], name="Name"),
                  columns=["Data1", "Data2", "Val1"])

特定のラベル名で抽出

特定のラベル名でデータを抽出する場合は、次のように指定します。

抽出先 df.loc[条件] df.filter()メソッドの引数
行抽出 df.loc[インデックス名] df.filter(items=["インデックス名"], axis=0)
列抽出 df.loc[:, カラム名] df.filter(items=["カラム名"], axis=1)

複数行、列を抽出する場合は、"カラム名"の代わりに[カラム名のリスト]を指定します。

.loc[], .filter()の順に、実行例を確認してみましょう。

# 特定の行を抽出
df.loc["Itou"]

# Data1    0
# Data2    1
# Val1     2
# Name: Itou, dtype: int32

# 複数列の場合
df.loc[:, ["Data1", "Data2"]]
#         Data1  Data2
# Name                
# Itou        0      1
# Kudou       3      4
# Naitou      6      7
# Saitou      9     10
# Satou      12     13
# Suzuki     15     16

.loc[]では、結果が一列のみの場合は、Seriesで返されます。

次に.filter()の実行例を確認します。

# 特定の行を抽出
df.filter(items=["Itou"], axis=0)

# Data1    0
# Data2    1
# Val1     2
# Name: Itou, dtype: int32

# 複数列の場合
df.filter(["Data1", "Data2"],axis=1)
#         Data1  Data2
# Name                
# Itou        0      1
# Kudou       3      4
# Naitou      6      7
# Saitou      9     10
# Satou      12     13
# Suzuki     15     16

.filter()では、結果が一列でも、DataFrameで返されます。

サンプルコードからわかるように、単にラベル名でデータ抽出する場合は.loc[]が便利です。

.loc.ilocで、特定のラベル名、行/列番号で抽出する方法は、次の記事を参考にしてください。

≫pandas DataFrameの行・列を抽出|loc, ilocなどわかりやすく解説!
pandasのDataFrameを使うと、行と列で構成されたデータを簡単に取り扱うことができます。この記事では、「DataFrameの特定の行、列のデータを抽出する方法」、「インデックス参照、.loc、.iloc、at、iat[]の使い方」をわかりやすい図解付きで解説しています。
www.yutaka-note.com/entry/pandas_access
 

条件を満たすラベル名のデータ抽出

単にラベル名を指定するのでなく、特定の条件を満たすラベルのデータを抽出する方法を紹介します。

ラベル名に条件を追加してデータ抽出する場合は、.loc[]よりも.filter()の方が簡単な場合が多いです。

ラベル候補から抽出

複数のラベル候補を用意して、その中にラベル名が含まれるデータを抽出する方法を紹介します。

抽出先 df.loc[条件] df.filter()メソッド
行抽出 df.loc[df.index.isin(["ラベル候補"])] df.filter(items=["ラベル候補"], axis=0)
列抽出 df.loc[:, df.columns.isin(["ラベル候補"])] df.filter(items=["ラベル候補"], axis=1)

.loc[]では、存在しないラベルを直接指定できないため、df.index, df.columnsを使って条件を設定します。

ラベル候補からの抽出は.filter()の方が、シンプルな記述ができますね。

.loc[], .filter()の順に、実行例を確認してみましょう。

df.loc[df.index.isin(["Kudou", "Gotou", "Kondou", "Satou"])]
#        Data1  Data2  Val1
# Name                     
# Kudou      3      4     5
# Satou     12     13    14

df.loc[:, df.columns.isin(["Val1", "Val2", "Val3"])]
#         Val1
# Name        
# Itou       2
# Kudou      5
# Naitou     8
# Saitou    11
# Satou     14
# Suzuki    17

次に.filter()の実行例を確認します。

df.filter(items=["Kudou", "Gotou", "Kondou", "Satou"], axis=0)
#        Data1  Data2  Val1
# Name                     
# Kudou      3      4     5
# Satou     12     13    14

df.filter(["Val1", "Val2", "Val3"], axis=1)
#         Val1
# Name        
# Itou       2
# Kudou      5
# Naitou     8
# Saitou    11
# Satou     14
# Suzuki    17

.filter()の方が、相当簡潔に書けますね。

特定の文字列を含む

特定の文字列を含むラベルのデータを抽出するには、次のように指定します。

抽出先 df.loc[条件] df.filter()メソッド
行抽出 df.loc[df.index.str.cotains("文字列")] df.filter(like="文字列", axis=0)
列抽出 df.loc[:, df.columns.str.cotains("文字列")] df.filter(like="文字列", axis=1)

こちらも.filter()の方が、シンプルな記述ができますね。

.loc[], .filter()の順に、実行例を確認してみましょう。

df.loc[df.index.str.contains("ito")]
#         Data1  Data2  Val1
# Name                      
# Naitou      6      7     8
# Saitou      9     10    11

df.loc[:, df.columns.str.contains("Data")]
#         Data1  Data2
# Name                
# Itou        0      1
# Kudou       3      4
# Naitou      6      7
# Saitou      9     10
# Satou      12     13
# Suzuki     15     16

次に.filter()の実行例を確認します。

df.filter(like="ito", axis=0)
#         Data1  Data2  Val1
# Name                      
# Naitou      6      7     8
# Saitou      9     10    11

df.filter(like="Data", axis=1)
#         Data1  Data2
# Name                
# Itou        0      1
# Kudou       3      4
# Naitou      6      7
# Saitou      9     10
# Satou      12     13
# Suzuki     15     16

正規表現のパターン指定については、次の記事でわかりやすく解説しています。

≫Python正規表現パターンを図解&サンプルで本当にわかりやすく解説
Pythonのreモジュールで正規表現パターンを作成する際に重要な3つのポイントを解説します。①特定の文字の繰り返しを指定 ②数値や文字、空白など条件による文字条件の指定 ③グループ化によるパターン内の特定部分の抽出
www.yutaka-note.com/entry/regex_01
 

特定の文字列で始まる

特定の文字列で始まるラベルのデータを抽出するには、次のように指定します。

抽出先 df.loc[条件] df.filter()メソッド
行抽出 df.loc[df.index.str.startswith("文字列")] df.filter(regex="^文字列", axis=0)
列抽出 df.loc[:, df.columns.str.startswith("文字列")] df.filter(regex="^文字列", axis=1)

.filter()では、正規表現の"^"で先頭一致を指定しています。

.loc[], .filter()の順に、実行例を確認してみましょう。

df.loc[df.index.str.startswith("S")]
#         Data1  Data2  Val1
# Name                      
# Saitou      9     10    11
# Satou      12     13    14
# Suzuki     15     16    17

次に.filter()の実行例を確認します。

df.filter(regex="^S", axis=0)
#         Data1  Data2  Val1
# Name                      
# Saitou      9     10    11
# Satou      12     13    14
# Suzuki     15     16    17

特定の文字列で終わる

特定の文字列で終わるラベルのデータを抽出するには、次のように指定します。

抽出先 df.loc[条件] df.filter()メソッド
行抽出 df.loc[df.index.str.endswith("文字列")] df.filter(regex="文字列$", axis=0)
列抽出 df.loc[:, df.columns.str.endswith("文字列")] df.filter(regex="^文字列$", axis=1)

.filter()では、正規表現の"$"で文末一致を指定しています。

.loc[], .filter()の順に、実行例を確認してみましょう。

df.loc[df.index.str.endswith("tou")]
#         Data1  Data2  Val1
# Name                      
# Itou        0      1     2
# Naitou      6      7     8
# Saitou      9     10    11
# Satou      12     13    14

次に.filter()の実行例を確認します。

df.filter(regex="tou$", axis=0)
#         Data1  Data2  Val1
# Name                      
# Itou        0      1     2
# Naitou      6      7     8
# Saitou      9     10    11
# Satou      12     13    14
  • 【参考】pandasのインデックスを使った基本操作、検索、ソート、重複判定などについては、次の記事で解説しています。
≫pandas インデックス列の基本操作|要素にアクセス、検索、欠損値処理
pandasのDataFrameでは、インデックス列の操作方法に関して、網羅的に解説!①インデックスの基本構造②インデックス内要素へのアクセス方法③インデックス内のデータ検索、並べ替え、重複処理、欠損値処理。サンプルコード付きでわかりやすく解説!
www.yutaka-note.com/entry/pandas_index_manip
 

正規表現で複雑な条件を設定

最後に正規表現を使用して、複雑な抽出条件を設定する方法を紹介します。

抽出先 df.loc[条件] df.filter()メソッド
行抽出 df.index.str.contains("正規表現") df.filter(regex="正規表現",axis=0)
列抽出 df.columns.str.contains("正規表現") df.filter(regex="正規表現",axis=1)

正規表現を使用すれば、かなり自由にデータ抽出が可能です。

df.loc[df.index.str.contains("tou|dou$")]
#         Data1  Data2  Val1
# Name                      
# Itou        0      1     2
# Kudou       3      4     5
# Naitou      6      7     8
# Saitou      9     10    11
# Satou      12     13    14

.filter()の例も確認してみましょう。

df.filter(regex="(S|N)\w+tou", axis=0)
#         Data1  Data2  Val1
# Name                      
# Naitou      6      7     8
# Saitou      9     10    11
# Satou      12     13    14

正規表現のパターン指定については、次の記事でわかりやすく解説しています。

≫Python正規表現パターンを図解&サンプルで本当にわかりやすく解説
Pythonのreモジュールで正規表現パターンを作成する際に重要な3つのポイントを解説します。①特定の文字の繰り返しを指定 ②数値や文字、空白など条件による文字条件の指定 ③グループ化によるパターン内の特定部分の抽出
www.yutaka-note.com/entry/regex_01
 

オススメ|pandasとデータ分析の勉強方法

今回はラベルからのデータ抽出について解説しました。

pandasは便利すぎて操作方法がわかりにくいことがよくあります…。

結局はコツコツ学ぶのが、pandasマスターの近道ですよね!

≫【ブログカテゴリー:pandas】

データ分析初心者の方にはこちらの記事もおススメです。

私がこれまで勉強してきた経験をもとに考えたおススメの勉強本の紹介記事です。

何から始めて、どうやってレベルアップしていけばいいのか、初心者の方にぜひおススメしたい本を紹介しました。

≫独学でデータ分析を勉強するオススメ学習本
独学でのpythonデータ分析勉強に役立ったおススメ書籍を紹介していきます。業務でそれなりにデータ分析を行えるまで、いろいろな試行錯誤をしてきましたが、もし自分が今ゼロから勉強する立場ならどうするのがいいのか考えてみました。以下では、入門書、個別モジュール用、実践用の3つの視点でおススメ本を紹介していきます。
www.yutaka-note.com/entry/data_analysis
 

オススメのpandas本については、次の記事で紹介しています。

≫【レビュー】「Python実践データ分析100本ノック」|100本終えたらpandasが好きになっていた
Python実践データ分析100本ノックで、実際に100本終了したレビューです。pythonでのデータ分析の入門書としてかなりの良書だったと思います。・python2~3冊目に何を勉強しようか迷っている人・時間をかけずにデータ分析の基本を学びたい人・pandasへの抵抗を減らしたい人
www.yutaka-note.com/entry/nock_100
 
≫【レビュー】「Pythonによるデータ分析入門」| pandas開発者によるpandasユーザーのためのpandasの教科書!
「Pythonによるデータ分析入門」を、最初から最後まで実際に実践してみたレビューです。具体的にどのようなことができるようになったかを実例付きで紹介します!・DataFrameの生成方法・欠損値の処理方法・グラフ化の方法気になる学習時間は…?
www.yutaka-note.com/entry/2019/12/07/230219