データ分析では、特定の行・列のデータを抽出することがよくあります。
しかし、pandas
は抽出方法が柔軟すぎて、逆に抽出方法がわからなくなってしまうことも…。
そこで、この記事ではラベルからのデータ抽出について、次の内容をわかりやすく解説します!
- 行名・列名を指定してデータを抽出する方法は?
- 特定の文字を含んでいる行・列を抽出する方法は?
- 正規表現で複雑な条件を設定する方法は?
ラベルからのデータ抽出ができるようになると、DataFrame
の操作がぐっと楽になります!
行名・列名からのデータ抽出まとめ
行名・列名(以下、まとめてラベル名と呼称)からのデータ抽出には、主に次のパターンがあります。
- 特定のラベル名を指定する
- ラベル名が…
- 特定のラベル候補のどれかに当てはまる
- 特定の文字列を含む
- 特定の文字列で始まる/終わる
- 正規表現で複雑な条件を指定する
これらのラベル名をもとにしたデータ抽出は、次の2つの抽出方法があります。
df.loc[条件]
で適切な条件を与える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にインデックスを設定する方法については、次の記事で解説しています。
行抽出・列抽出の選択
インデックス、カラムどちらで抽出するかは、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
で、特定のラベル名、行/列番号で抽出する方法は、次の記事を参考にしてください。
条件を満たすラベル名のデータ抽出
単にラベル名を指定するのでなく、特定の条件を満たすラベルのデータを抽出する方法を紹介します。
ラベル名に条件を追加してデータ抽出する場合は、.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
正規表現のパターン指定については、次の記事でわかりやすく解説しています。
特定の文字列で始まる
特定の文字列で始まるラベルのデータを抽出するには、次のように指定します。
抽出先 | 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のインデックスを使った基本操作、検索、ソート、重複判定などについては、次の記事で解説しています。
正規表現で複雑な条件を設定
最後に正規表現を使用して、複雑な抽出条件を設定する方法を紹介します。
抽出先 | 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
正規表現のパターン指定については、次の記事でわかりやすく解説しています。
オススメ|pandasとデータ分析の勉強方法
今回はラベルからのデータ抽出について解説しました。
pandas
は便利すぎて操作方法がわかりにくいことがよくあります…。
結局はコツコツ学ぶのが、pandas
マスターの近道ですよね!
データ分析初心者の方にはこちらの記事もおススメです。
私がこれまで勉強してきた経験をもとに考えたおススメの勉強本の紹介記事です。
何から始めて、どうやってレベルアップしていけばいいのか、初心者の方にぜひおススメしたい本を紹介しました。
オススメのpandas
本については、次の記事で紹介しています。