DataFrame内の文字列がリストに含まれるかを確認する方法

本記事ではDataFrameの文字列と別途定義したリストを照合し,リストに含まれる/含まれない行を抽出する方法について解説しています.

事前準備

まずはサンプルのDataFrameを作成します.


import pandas as pd

df1 = pd.DataFrame({
    'birds': ['十姉妹', '文鳥', 'ハヤブサ', 'カラス'],
    'weight(g)': [15, 26, 950, 650]
})
df1
birds weight(g)
0 十姉妹 15
1 文鳥 26
2 ハヤブサ 950
3 カラス 650

DataFrameの文字列をリストと照合

作成したDataFrameのbirds列内に特定の文字列が含まれるかを調べます.
特定の文字列をリストとして定義し,そのリスト内にある文字列とDataFrameのbirds列を照合します.


# 調べたいリスト
birds_list = ['文鳥', 'ハト', 'ムクドリ', 'カラス']

# dfの文字列がリスト内に含まれる場合,dfを返す
df1.query('birds in @birds_list')
birds weight(g)
1 文鳥 26
3 カラス 650

birds列とbirds_listで一致している「文鳥」「カラス」だけがDataFrameとして返ってきていますね.

参考

query()内で変数を使用する場合は@を変数の前に付けます.
今回は変数を使用していますが直接リストを指定してもOKです.

リストに「含まれない」行を抽出

not inを使用して,以下のようにすればOKです.


# 含まれない,を調べる場合は not in 
df1.query('birds not in @birds_list')
birds weight(g)
0 十姉妹 15
2 ハヤブサ 950

birds列とbirds_listで一致していない「十姉妹」「ハヤブサ」だけになりましたね.

DataFrame同士で比較

DataFrame同士を比較することもできます.
準備として比較用のDataFrameを新たに作成しdf1と共に出力しています.


# 比較するdfの作成
df2 = pd.DataFrame({
    'birds': ['十姉妹', '文鳥', 'ハヤブサ', 'ハト'],
    'weight(g)': [15, 26, 950, 350]
})
display(df1)
display(df2)
birds weight(g)
0 十姉妹 15
1 文鳥 26
2 ハヤブサ 950
3 カラス 650
birds weight(g)
0 十姉妹 15
1 文鳥 26
2 ハヤブサ 950
3 ハト 350

以下でbirds列同士を比較します.
df1のbirds列のうち「カラス」だけがdf2のbirds列に含まれないので「カラス」が出力されています.


df1.query('birds not in @df2["birds"]')
birds weight(g)
3 カラス 650
詳細が知りたい方はこちらをクリック

このコードではこれまでリストを指定していた@以降の部分にdf2["birds"](=pandas Series)を指定しています.

Seriesはリストと概ね同じように扱うことができin演算子も使えるため,上記のようなコードを実行することが可能です.

なおdf2["birds"]とデータ型を見ると以下のような感じです.


print(s := df2["birds"], '\n')  # '\n' は改行を入れているだけです.
print(type(s))
0     十姉妹
1      文鳥
2    ハヤブサ
3      ハト
Name: birds, dtype: object

<class 'pandas.core.series.Series'>

ひとこと

query()はDataFrameのデータを見る際などによく使うので,さっと使えると便利ですね.