【Python】Pandasで条件一致した行を抽出する方法

【Python】Pandasで条件一致した行を抽出する方法

この記事ではDataFrame(Series)において完全一致した行の抽出、部分一致した行の抽出、不等号で条件一致した行の抽出、AND、OR、NOTを使用した条件指定方法を紹介します。

この記事の目標
・完全一致で行を抽出する方法の理解
・部分一致で行を抽出する方法の理解
・不等号の条件一致で行を抽出する方法の理解
・ANDで複数条件指定する方法の理解
・ORで複数条件指定する方法の理解
・NOTでの条件指定方法の理解

DataFrameとSeries型の違いがわからない人はまず以下の記事で理解しましょう!!
DataFrameとSeriesの違いを紹介
その他Pythonの記事は以下にまとめています!!

Python記事まとめ

[スポンサーリンク]


完全一致で抽出

完全一致した行だけを取り出す場合==を使います。
記載方法は以下の通り

指定のdf[Series型 == 数値や文字]
(DataFrameで列指定すればSeries型【df[0]など】)

確認のために以下のDataFrameを使用します。

import pandas as pd
df=pd.DataFrame([["A",10],["A",20],["B",30],["B",40]])
print(df)

"""
#出力結果
  0 1
0 A 10
1 A 20
2 B 30
3 B 40
"""

では0列目がAの行だけ抽出してみましょう。

df1=df[df[0] == "A"]
print(df1)
#出力結果
#  0 1
#0 A 10
#1 A 20

0列目がAの行だけ抽出できました。

 

部分一致で抽出

文字列において部分一致した部分だけを抽出する方法を紹介します。
それぞれ特定の文字がある場合、特定の文字列で終わる場合、特定の文字列で始まる場合、さらに詳しい条件を正規表現で指定する場合の4種類です。
自分の今探している部分を参考にしてみてください。

確認するにあたり以下のDataFrameを使用します。

import pandas as pd 
df=pd.DataFrame([["ABC",10],["BCD",20],["BCA",30],["FIR",40]])
print(df)

#出力結果
#   0 1
#0 ABC 10
#1 BCD 20
#2 BCA 30
#3 FIR 40

特定の文字列を含む

特定の文字列を含む場合を抽出するにはstr.contains()メソッドを使用します。
記載方法は以下の通り

指定のdf[dfの列.str.contains(文字列)]

(Seriesの場合)
指定のdf[指定のdf.str.contains(文字列)]

ではDataFrame0列目においてBCが含まれている行だけを抽出してみましょう。

実行前

print(df)
#出力結果
#    0 1
#0 ABC 10
#1 BCD 20
#2 BCA 30
#3 FIR 40

実行後

df1=df[df[0].str.contains("BC")]
print(df1)

#出力結果
#  0 1
#0 ABC 10
#1 BCD 20
#2 BCA 30

0列目にBCが含まれている3つの行が抽出されました。

特定の文字列で終わる

特定の文字列で終わる場合はstr.endswith()メソッドを使用します。
記載方法は以下の通り

指定のdf[dfの列.str.endswith(文字列)]

(Seriesの場合)
指定のdf[指定のdf.str.endswith(文字列)]

ではDataFrame0列目がBCで終わる行だけを取り出してみましょう。

実行前

print(df)
#出力結果
#   0 1
#0 ABC 10
#1 BCD 20
#2 BCA 30
#3 FIR 40

実行後

df1=df[df[0].str.endswith("BC")]
print(df1)

#出力結果
#    0 1
#0 ABC 10

0列目においてBCで終了している0行目だけが抽出されました。

特定の文字列で始まる

特定の文字列で始まる行だけを抽出する時はstr.startswith()メソッドを使用します。
記載方法は以下の通り

指定のdf[dfの列.str.startswith(文字列)]

(Seriesの場合)
指定のdf[指定のdf.str.startswith(文字列)]

ではDataFrame0列目がBCで始まる行だけを抽出してみましょう。

実行前

print(df)
#出力結果
#    0 1
#0 ABC 10
#1 BCD 20
#2 BCA 30
#3 FIR 40

実行後

df1=df[df[0].str.startswith("BC")]
#出力結果
#    0 1
#1 BCD 20
#2 BCA 30

BCで始まる2つの行が抽出されました。

正規表現でさらに詳しく条件指定

もっと詳しく文字列の条件を指定したい!!という場合は正規表現のstr.match()メソッドを使用します。
記載方法は以下の通り

指定のdf[指定の列.str.match(正規表現)]

(Seriesの場合)
指定のdf[指定のdf.str.match(正規表現)]

確認するために以下のDataFrameを使用します

 import pandas as pd 
df=pd.DataFrame([["ABCDEF",10],["FEDCBA",20],["QWQWQW",30],["ABABAB",40]])
print(df)

#出力結果
#       0 1
#0 ABCDEF 10
#1 FEDCBA 20
#2 QWQWQW 30
#3 ABABAB 40

例えばABの後にFがある文字列だけ抽出したい!!なんて時に正規表現が使えます。
正規表現で表すと(“.*AB.*F”)となります。
0列目で実際に抽出してみましょう。

df1=df[df[0].str.match(".*AB.*F")]
#出力結果
#       0 1
#0 ABCDEF 10

確かにAB→Fの順番になっている文字列の行が抽出されました。

このように正規表現を使用すれば指定したい文字列が飛び飛びでも指定できるのでとても便利です!

不等号で抽出

次に不等号で条件一致している行だけ抽出します。
記載方法は以下の通り。

指定のdf[Series型 不等号 数値]

確認のために以下のDataFrameを使用。

import pandas as pd
df=pd.DataFrame([["A",10],["A",20],["B",30],["B",40]])
print(df)

#出力結果
# 0 1
#0 A 10
#1 A 20
#2 B 30
#3 B 40

では1列目が20より大きい行だけ取り出します

df1=df[df[1] > 20]
print(df1)
#実行結果
# 0 1
#2 B 30
#3 B 40

1列目が20より大きい行だけ抽出できました。

[スポンサーリンク]


ANDで抽出

複数条件一致で指定する時は&を使用します。

指定のdf[(条件) & (条件)…]

確認のために以下のDataFrameを使用します。

import pandas as pd
df=pd.DataFrame([["A",10],["A",20],["B",30],["B",40]])
print(df)

#出力結果
# 0 1
#0 A 10
#1 A 20
#2 B 30
#3 B 40

では0列目でAと一致かつ1列目で10よりも大きい行を取り出してみます。

df1=df[(df[0] == "A") & (df[1] > 10)]
print(df1)

#出力結果
# 0 1
#1 A 20

唯一ヒットする1行目が抽出できました。

ORで抽出

次にORを使用して複数条件を指定します。
ORを使用する時はを記載します。

指定のdf[(条件) | (条件)…]

確認のために以下のDataFrameを使用します。

import pandas as pd
df=pd.DataFrame([["A",10],["A",20],["B",30],["B",40]])
print(df)

#出力結果
# 0 1
#0 A 10
#1 A 20
#2 B 30
#3 B 40

では0列目がBまたは1列目が10より大きい行を取り出します。

df1=df[(df[0] == "B") | (df[1] > 10)]
print(df1)
#出力結果
# 0 1
#1 A 20
#2 B 30
#3 B 40

条件に一致した3つの行が抽出されました。

NOTで抽出

次にNOT条件を使用して抽出します。
NOTは~を使用します。

指定のdf[~(条件)]

では確認のために以下のDataFrameを使用します。

import pandas as pd
df=pd.DataFrame([["A",10],["A",20],["B",30],["B",40]])
print(df)

#出力結果
# 0 1
#0 A 10
#1 A 20
#2 B 30
#3 B 40

0列目がA以外の行を抽出します。

df1=df[~(df[0] == "A")]
print(df1)
#出力結果
# 0 1
#2 B 30
#3 B 40

0列目がAではない行が抽出されました。

Pandasカテゴリの最新記事