Pandas の特定の値に一致する列の行のインデックスを取得する

Sathiya Sarathi 2023年1月30日
  1. Pandas で整数/浮動小数点数を含む行のインデックスを取得する
  2. Pandas で文字列を含む行のインデックスを取得する
Pandas の特定の値に一致する列の行のインデックスを取得する

この記事では、Pandas で特定の条件にマッチする行のインデックスを取得する方法を紹介します。

行のインデックスを見つける必要性は、フィーチャエンジニアリングにおいて重要です。これらのスキルは、Dataframe 内の外れ値や異常値を取り除くのに役立ちます。行ラベルとも呼ばれるインデックスは、いくつかの関数を使用して Pandas で見つけることができます。以下の例では、以下のスニペットを使用して作成された Dataframe で作業を行います。

import pandas as pd
import numpy as np

np.random.seed(0)

df = pd.DataFrame(np.random.randint(1, 20, size=(20, 4)), columns=list("ABCD"))

print(df)

出力:

     A   B   C   D
0   13  16   1   4
1    4   8  10  19
2    5   7  13   2
3    7   8  15  18
4    6  14   9  10
5   17   6  16  16
6    1  19   4  18
7   15   8   1   2
8   10   1  11   4
9   12  19   3   1
10   1   5   6   7
11   9  18  16   5
12  10  11   2   2
13   8  10   4   7
14  12  15  19   1
15  15   4  13  11
16  12   5   7   5
17  16   4  13   5
18   9  15  16   4
19  16  14  17  18

Pandas で整数/浮動小数点数を含む行のインデックスを取得する

関数 pandas.DataFrame.loc はラベルや名前を指定して行や列にアクセスすることができます。ラベルとして渡されたブーリアン条件にマッチする行を返すことができます。スニペットの中の df.loc の隣にある角括弧に注意してください。

import pandas as pd
import numpy as np

np.random.seed(0)

df = pd.DataFrame(np.random.randint(1, 20, size=(20, 4)), columns=list("ABCD"))

print(df.loc[df["B"] == 19])

ブール条件に対応する行は、Dataframe のフォーマットで出力として返されます。

出力:

    A   B  C   D
6   1  19  4  18
9  12  19  3   1

以下に示すように、複数の条件を連結して関数に適用することができます。これにより、特定の条件に基づいて行を分離するのに役立ちます。

import pandas as pd
import numpy as np

np.random.seed(0)

df = pd.DataFrame(np.random.randint(1, 20, size=(20, 4)), columns=list("ABCD"))

print(df.loc[(df["B"] == 19) | (df["C"] == 19)])

出力:

     A   B   C   D
6    1  19   4  18
9   12  19   3   1
14  12  15  19   1

pandas.DataFrame.index() で行のインデックスを取得する

引数として渡されたブーリアン条件を満たす DataFrame の一致するインデックスだけを見つけたい場合は、pandas.DataFrame.index() が最も簡単な方法です。

import pandas as pd
import numpy as np

np.random.seed(0)

df = pd.DataFrame(np.random.randint(1, 20, size=(20, 4)), columns=list("ABCD"))

print(df.index[df["B"] == 19].tolist())

上のスニペットでは、ブーリアン条件 == 1 にマッチする列 A の行が以下のように出力されています。

出力:

[6, 9]

index() メソッドの後ろに tolist() を置く理由は、Index をリストに変換するためです。

Int64Index([6, 9], dtype='int64'

複数の条件に基づいてインデックスだけを取得することもできます。スニペットは以下のように書くことができます。

import pandas as pd
import numpy as np

np.random.seed(0)

df = pd.DataFrame(np.random.randint(1, 20, size=(20, 4)), columns=list("ABCD"))

print(df.index[(df["B"] == 19) | (df["C"] == 19)].tolist())

出力:

[6, 9, 14]

Pandas で文字列を含む行のインデックスを取得する

文字列の値は、2つの方法に基づいて一致させることができます。前項で示した方法は、条件変更以外はどちらも動作します。

以下の例では、以下のスニペットを使用します。

import pandas as pd

df = pd.DataFrame(
    {
        "Name": ["blue", "delta", "echo", "charlie", "alpha"],
        "Type": ["Raptors", "Raptors", "Raptors", "Raptors", "Tyrannosaurus rex"],
    }
)

print(df)

出力:

      Name               Type
0     blue            Raptors
1    delta            Raptors
2     echo            Raptors
3  charlie            Raptors
4    alpha  Tyrannosaurus rex

文字列が完全に一致する行のインデックスを取得する

前節で使用した等号条件は、Dataframe 内の正確な文字列の一致を見つける際に使用することができます。ここでは、2つの文字列を探します。

import pandas as pd

df = pd.DataFrame(
    {
        "Name": ["blue", "delta", "echo", "charlie", "alpha"],
        "Type": ["Raptors", "Raptors", "Raptors", "Raptors", "Tyrannosaurus rex"],
    }
)

print(df.index[(df["Name"] == "blue")].tolist())
print("\n")
print(df.loc[df["Name"] == "blue"])
print("\n")
print(df.loc[(df["Name"] == "charlie") & (df["Type"] == "Raptors")])

出力:

[0]

   Name     Type
0  blue  Raptors

      Name     Type
3  charlie  Raptors

上で見たように、条件に一致するインデックスと行の両方を受け取ることができます。

部分的に文字列が一致する行のインデックスを取得する

文字列の値は、DataFrame を str.contains 関数に連結することで部分的にマッチさせることができます。以下の例では、charlie と alphaで文字列 ha を探します。

import pandas as pd

df = pd.DataFrame(
    {
        "Name": ["blue", "delta", "echo", "charlie", "alpha"],
        "Type": ["Raptors", "Raptors", "Raptors", "Raptors", "Tyrannosaurus rex"],
    }
)

print(df.index[df["Name"].str.contains("ha")].tolist())
print("\n")
print(df.loc[df["Name"].str.contains("ha")])
print("\n")
print(df.loc[(df["Name"].str.contains("ha")) & (df["Type"].str.contains("Rex"))])

出力:

[3, 4]

      Name               Type
3  charlie            Raptors
4    alpha  Tyrannosaurus rex


    Name               Type
4  alpha  Tyrannosaurus rex

この関数は、DataFrame の複数の列にまたがる部分的な文字列マッチングを実行するのに非常に便利です。

関連記事 - Pandas DataFrame

関連記事 - Pandas DataFrame Row