Pandas Series.str.contains() 関数
Series.str.contains()これは、Pandas で文字列が指定した部分文字列を含むかどうかを確認するための関数です。
データ処理の過程では、テキストの内容に基づいてフィルタリングや抽出を行うことがよくあります。例えば、特定のキーワードを含むレコードを検索したり、あるパターンに一致するテキストを抽出したりします。contains()この関数は、各文字列要素が指定した部分文字列または正規表現パターンを含むかどうかを確認できます。
単語の意味:contains「contains」は「含む」という意味で、文字列が指定した内容を含むかどうかを確認することを表します。
基本構文とパラメータ
str.contains()これは Series の文字列アクセサメソッドです。そのため、まず文字列を含む Series が必要で、その後.strアクセサを使って呼び出します。
構文形式
Series.str.contains(pat, case=True, regex=True, na=None)
パラメータの説明
| パラメータ | 型 | 必須かどうか | 説明 | デフォルト値 |
|---|---|---|---|---|
| pat | str | 必須 | 検索するパターン。通常の文字列または正規表現を指定できます。 | - |
| case | bool | 任意 | 大文字小文字を区別するかどうか。デフォルトは True(大文字小文字を区別)です。 | True |
| regex | bool | 任意 | pat パラメータを正規表現として扱うかどうか。デフォルトは True です。 | True |
| na | object | 任意 | 要素が NaN の場合に返す値。デフォルトは None(NaN を返す)です。 | None |
関数の説明
- 戻り値: 各要素が指定したパターンを含むかどうかを示す、ブール値の Series を返します。
- 効果: Series 内の各文字列要素を確認し、True または False を返します。
- 注意: デフォルトで正規表現を使用するため、より複雑なパターンにマッチさせることができます。
例
簡単なものから複雑なものまで一連の例を通して、完全に使いこなせるようになりましょう。str.contains()の使い方を学びましょう。
例1:基本的な使い方 - 部分文字列が含まれるかを確認
例
import pandas as pd
# テキストを含む Series を作成
s = pd.Series(['apple', 'banana', 'grape', 'pineapple', 'orange'])
# 'ap' が含まれるか確認
result = s.str.contains('ap')
print("元の Series:")
print(s)
print("n'ap' が含まれるか:")
print(result)
# テキストを含む Series を作成
s = pd.Series(['apple', 'banana', 'grape', 'pineapple', 'orange'])
# 'ap' が含まれるか確認
result = s.str.contains('ap')
print("元の Series:")
print(s)
print("n'ap' が含まれるか:")
print(result)
出力結果:
原始 Series: 0 apple 1 banana 2 grape 3 pineapple 4 orange dtype: object 是否包含 'ap': 0 True 1 False 2 True 3 True 4 False
コードの解説:
s.str.contains('ap')各文字列が 'ap' という部分文字列を含むかを確認します。- 'apple' は 'ap' を含むため、True を返します。
- 'banana' は 'ap' を含まないため、False を返します。
- 'grape' は 'ap' を含むため、True を返します。
- 'pineapple' は 'ap' を含むため、True を返します。
例2:正規表現を使ったマッチング
contains()デフォルトでは正規表現を使用するため、より複雑なパターンにマッチさせることができます。
例
import pandas as pd
# テキストを含む Series を作成
s = pd.Series(['hello123', 'world456', 'サンプル789', 'python', 'test123'])
# 正規表現を使って、文字で始まり数字で終わる文字列にマッチさせる
result = s.str.contains(r'^[a-zA-Z]+d+$')
print("元の Series:")
print(s)
print("n文字で始まり数字で終わるパターンにマッチ:")
print(result)
# テキストを含む Series を作成
s = pd.Series(['hello123', 'world456', 'サンプル789', 'python', 'test123'])
# 正規表現を使って、文字で始まり数字で終わる文字列にマッチさせる
result = s.str.contains(r'^[a-zA-Z]+d+$')
print("元の Series:")
print(s)
print("n文字で始まり数字で終わるパターンにマッチ:")
print(result)
出力結果:
原始 Series: 0 hello123 1 world456 2 サンプル789 3 python 4 test123 dtype: object 匹配字母开头+数字结尾的模式: 0 True 1 True 2 True 3 False 4 True
コードの解説:
r'^[a-zA-Z]+d+$'は正規表現で、文字で始まり数字で終わる文字列にマッチします。^は文字列の先頭を表し、$は文字列の末尾を表します。- 'python' は数字を含まないため、マッチしません。
例3:大文字小文字を区別しないマッチング
設定することで、case=False大文字小文字を区別しないマッチングができます。
例
import pandas as pd
# 大文字小文字の異なるテキストを含む Series を作成
s = pd.Series(['Apple', 'APPLE', 'apple', 'Banana', 'APPLE'])
# 大文字小文字を区別してマッチング
result_case = s.str.contains('APPLE')
# 大文字小文字を区別せずにマッチング
result_nocase = s.str.contains('APPLE', case=False)
print("元の Series:")
print(s)
print("n大文字小文字を区別したマッチング 'APPLE':")
print(result_case)
print("n大文字小文字を区別しないマッチング 'APPLE':")
print(result_nocase)
# 大文字小文字の異なるテキストを含む Series を作成
s = pd.Series(['Apple', 'APPLE', 'apple', 'Banana', 'APPLE'])
# 大文字小文字を区別してマッチング
result_case = s.str.contains('APPLE')
# 大文字小文字を区別せずにマッチング
result_nocase = s.str.contains('APPLE', case=False)
print("元の Series:")
print(s)
print("n大文字小文字を区別したマッチング 'APPLE':")
print(result_case)
print("n大文字小文字を区別しないマッチング 'APPLE':")
print(result_nocase)
出力結果:
原始 Series: 0 Apple 1 APPLE 2 apple 3 Banana 4 APPLE dtype: object 区分大小写匹配 'APPLE': 0 False 1 True 2 False 3 False 4 True 不区分大小写匹配 'APPLE': 0 True 1 True 2 True 3 False 4 True
コードの解説:
case=True(デフォルト)大文字小文字を区別し、完全に同じ 'APPLE' のみマッチします。case=False大文字小文字を区別しない場合、'Apple'、'APPLE'、'apple' のすべてがマッチします。
例4:欠損値の処理
を通じてnaパラメータで NaN 値の処理方法を指定できます。
例
import pandas as pd
import numpy as np
# NaN 値を含む Series を作成
s = pd.Series(['apple', 'banana', np.nan, 'grape', None])
# デフォルトの NaN 処理(NaN を返す)
result_default = s.str.contains('ap')
# NaN の場合に False を返すよう指定
result_na_false = s.str.contains('ap', na=False)
print("元の Series:")
print(s)
print("nデフォルト処理(NaN を返す):")
print(result_default)
print("nNaN を False として扱う:")
print(result_na_false)
import numpy as np
# NaN 値を含む Series を作成
s = pd.Series(['apple', 'banana', np.nan, 'grape', None])
# デフォルトの NaN 処理(NaN を返す)
result_default = s.str.contains('ap')
# NaN の場合に False を返すよう指定
result_na_false = s.str.contains('ap', na=False)
print("元の Series:")
print(s)
print("nデフォルト処理(NaN を返す):")
print(result_default)
print("nNaN を False として扱う:")
print(result_na_false)
出力結果:
原始 Series: 0 apple 1 banana 2 NaN 3 grape 4 None dtype: object 默认处理(返回 NaN): 0 True 1 False 2 NaN 3 True 4 NaN 将 NaN 视为 False: 0 True 1 False 2 False 3 True 4 False
コードの解説:
- デフォルトでは、NaN と None は NaN を返します。
- 設定すると、
na=FalseNaN をマッチしないものとして扱うことができます。 - 実際のデータ処理では、NaN によるフィルタリングの問題を避けることができるため、これは便利です。
例5:データのフィルタリング
contains()ブールインデックスと組み合わせてデータのフィルタリングによく使用されます。
例
import pandas as pd
# 模擬的な製品データの Series を作成
products = pd.Series([
'iPhone 14 Pro',
'Samsung Galaxy S23',
'iPhone 13',
'Google Pixel 7',
'iPad Pro',
'MacBook Air',
'Dell XPS 15'
])
# 'iPhone' を含む製品をフィルタリング
iphone_products = products[products.str.contains('iPhone')]
# 'i' を含まない製品をフィルタリング(大文字小文字を区別)
no_i_products = products[~products.str.contains('i')]
print("すべての製品:")
print(products)
print("n'iPhone' を含む製品:")
print(iphone_products)
print("n大文字の 'I' を含まない製品:")
print(no_i_products)
# 模擬的な製品データの Series を作成
products = pd.Series([
'iPhone 14 Pro',
'Samsung Galaxy S23',
'iPhone 13',
'Google Pixel 7',
'iPad Pro',
'MacBook Air',
'Dell XPS 15'
])
# 'iPhone' を含む製品をフィルタリング
iphone_products = products[products.str.contains('iPhone')]
# 'i' を含まない製品をフィルタリング(大文字小文字を区別)
no_i_products = products[~products.str.contains('i')]
print("すべての製品:")
print(products)
print("n'iPhone' を含む製品:")
print(iphone_products)
print("n大文字の 'I' を含まない製品:")
print(no_i_products)
出力結果:
所有产品: 0 iPhone 14 Pro 1 Samsung Galaxy S23 2 iPhone 13 3 Google Pixel 7 4 iPad Pro 5 MacBook Air 6 Dell XPS 15 dtype: object 包含 'iPhone' 的产品: 0 iPhone 14 Pro 2 iPhone 13 dtype: object 不包含大写 'I' 的产品: 6 Dell XPS 15
コードの解説:
products[products.str.contains('iPhone')]'iPhone' を含む製品をフィルタリングします。~products.str.contains('i')を使用して~否定し、'i' を含まない製品をフィルタリングします。- これはデータフィルタリングの一般的な操作です。
注意事項
str.contains()デフォルトでは正規表現を使用します(regex=True)。- 通常の文字列(正規表現として扱わない)にマッチさせる必要がある場合は、設定できます。
regex=False。 - デフォルトでは大文字小文字を区別します。使用
case=False大文字小文字を区別しないようにできます。 - デフォルトでは、NaN 値は NaN を返します。使用
naパラメータで戻り値を指定できます。 - この関数はブール値の Series を返すため、ブールインデックスによるデータフィルタリングに直接使用できます。
その他の拡張
Pandas よく使う関数