本記事では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のデータを見る際などによく使うので,さっと使えると便利ですね.