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 の列ヘッダーをリストとして取得する方法
- Pandas DataFrame 列を削除する方法
- Pandas で DataFrame 列を日時に変換する方法
- Pandas DataFrame で浮動小数点数 float を整数 int に変換する方法
- Pandas DataFrame を 1つの列の値で並べ替える方法
- Pandas group-by と Sum の集計を取得する方法