本記事ではDataFrameの文字列と別途定義したリストを照合し,リストに含まれる/含まれない行を抽出する方法について解説しています.
- 公式 Reference: pandas.DataFrame.query
事前準備
まずはサンプルの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のデータを見る際などによく使うので,さっと使えると便利ですね.