web-dev-qa-db-ja.com

Python:UserWarning:このパターンには一致グループがあります。実際にグループを取得するには、str.extractを使用します

データフレームがあり、文字列を取得しようとしましたが、列の一部にDfのような文字列が含まれています

member_id,event_path,event_time,event_duration
30595,"2016-03-30 12:27:33",yandex.ru/,1
30595,"2016-03-30 12:31:42",yandex.ru/,0
30595,"2016-03-30 12:31:43",yandex.ru/search/?lr=10738&msid=22901.25826.1459330364.89548&text=%D1%84%D0%B8%D0%BB%D1%8C%D0%BC%D1%8B+%D0%BE%D0%BD%D0%BB%D0%B0%D0%B9%D0%BD&suggest_reqid=168542624144922467267026838391360&csg=3381%2C3938%2C2%2C3%2C1%2C0%2C0,0
30595,"2016-03-30 12:31:44",yandex.ru/search/?lr=10738&msid=22901.25826.1459330364.89548&text=%D1%84%D0%B8%D0%BB%D1%8C%D0%BC%D1%8B+%D0%BE%D0%BD%D0%BB%D0%B0%D0%B9%D0%BD&suggest_reqid=168542624144922467267026838391360&csg=3381%2C3938%2C2%2C3%2C1%2C0%2C0,0
30595,"2016-03-30 12:31:45",yandex.ru/search/?lr=10738&msid=22901.25826.1459330364.89548&text=%D1%84%D0%B8%D0%BB%D1%8C%D0%BC%D1%8B+%D0%BE%D0%BD%D0%BB%D0%B0%D0%B9%D0%BD&suggest_reqid=168542624144922467267026838391360&csg=3381%2C3938%2C2%2C3%2C1%2C0%2C0,0
30595,"2016-03-30 12:31:46",yandex.ru/search/?lr=10738&msid=22901.25826.1459330364.89548&text=%D1%84%D0%B8%D0%BB%D1%8C%D0%BC%D1%8B+%D0%BE%D0%BD%D0%BB%D0%B0%D0%B9%D0%BD&suggest_reqid=168542624144922467267026838391360&csg=3381%2C3938%2C2%2C3%2C1%2C0%2C0,0
30595,"2016-03-30 12:31:49",kinogo.co/,1
30595,"2016-03-30 12:32:11",kinogo.co/melodramy/,0

そして、URL付きの別のdf

url
003\.ru\/[a-zA-Z0-9-_%$#?.:+=|()]+\/mobilnyj_telefon_bq_phoenix
003\.ru\/[a-zA-Z0-9-_%$#?.:+=|()]+\/mobilnyj_telefon_fly_
003\.ru\/sonyxperia
003\.ru\/[a-zA-Z0-9-_%$#?.:+=|()]+\/mobilnye_telefony_smartfony
003\.ru\/[a-zA-Z0-9-_%$#?.:+=|()]+\/mobilnye_telefony_smartfony\/brands5D5Bbr_23
1click\.ru\/sonyxperia
1click\.ru\/[a-zA-Z0-9-_%$#?.:+=|()]+\/chasy-Motorola

私が使う

urls = pd.read_csv('relevant_url1.csv', error_bad_lines=False)
substr = urls.url.values.tolist()
data = pd.read_csv('data_nts2.csv', error_bad_lines=False, chunksize=50000)
result = pd.DataFrame()
for i, df in enumerate(data):
    res = df[df['event_time'].str.contains('|'.join(substr), regex=True)]

しかし、それは私を返します

UserWarning: This pattern has match groups. To actually get the groups, use str.extract.

どうすれば修正できますか?

16
Petr Petrov

urlsの正規表現パターンの少なくとも1つは、キャプチャグループを使用する必要があります。 str.containsは、df['event_time']の各行に対してTrueまたはFalseのみを返します-キャプチャグループを使用しません。したがって、UserWarningは、正規表現がキャプチャグループを使用しているが、一致は使用されていないことを警告しています。

UserWarningを削除する場合は、正規表現パターンからキャプチャグループを見つけて削除できます。それらは投稿した正規表現パターンには表示されませんが、実際のファイルに存在している必要があります。文字クラスの外側の括弧を探します。

または、この特定のUserWarningを抑制して、

import warnings
warnings.filterwarnings("ignore", 'This pattern has match groups')

str.containsを呼び出す前。


これは、問題(および解決策)を示す簡単な例です。

# import warnings
# warnings.filterwarnings("ignore", 'This pattern has match groups') # uncomment to suppress the UserWarning

import pandas as pd

df = pd.DataFrame({ 'event_time': ['gouda', 'stilton', 'gruyere']})

urls = pd.DataFrame({'url': ['g(.*)']})   # With a capturing group, there is a UserWarning
# urls = pd.DataFrame({'url': ['g.*']})   # Without a capturing group, there is no UserWarning. Uncommenting this line avoids the UserWarning.

substr = urls.url.values.tolist()
df[df['event_time'].str.contains('|'.join(substr), regex=True)]

プリント

  script.py:10: UserWarning: This pattern has match groups. To actually get the groups, use str.extract.
  df[df['event_time'].str.contains('|'.join(substr), regex=True)]

キャプチャグループを正規表現パターンから削除します。

urls = pd.DataFrame({'url': ['g.*']})   

userWarningを回避します。

14
unutbu

警告を取り除く別の方法は、正規表現を変更して、キャプチャグループではなく、一致するグループにすることです。それが(?:)表記です。

したがって、一致するグループが(url1|url2)の場合、(?:url1|url2)に置き換える必要があります。

3
climatebrad

regex=Trueが指定されている場合、sublistは正規表現として扱われます。この場合、キャプチャグループ(括弧で囲まれた文字列)が含まれます。

何かをキャプチャしたい場合は str.contains (これはがブール値を返すので、指定されたパターンが文字列内に含まれるかどうか)

明らかに、警告を抑制することはできますが、警告を修正するのはbetterです。

かっこブロックをエスケープするか、本当にキャプチャしたい場合は str.extract を使用します。

2
Chankey Pathak

containsに渡す文字列にはre.escape(yourString)を使用する必要があります。

0
Rob