web-dev-qa-db-fra.com

Python: UserWarning: Ce modèle a des groupes de correspondance. Pour obtenir réellement les groupes, utilisez str.extract

J'ai une trame de données et j'essaie d'obtenir une chaîne, où une colonne contient une chaîne Df ressemble

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

Et un autre df avec des URL

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

J'utilise

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)]

mais ça me rend

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

Comment puis-je résoudre ce problème?

16
Petr Petrov

Au moins un des modèles d'expression régulière dans urls doit utiliser un groupe de capture. str.contains renvoie uniquement Vrai ou Faux pour chaque ligne de df['event_time'] - il n'utilise pas le groupe de capture. Ainsi, le UserWarning vous avertit que l'expression régulière utilise un groupe de capture mais que la correspondance n'est pas utilisée.

Si vous souhaitez supprimer le UserWarning, vous pouvez trouver et supprimer le groupe de capture des modèles d'expression régulière. Ils ne sont pas affichés dans les modèles d'expression régulière que vous avez publiés, mais ils doivent être présents dans votre fichier réel. Recherchez des parenthèses en dehors des classes de caractères.

Alternativement, vous pouvez supprimer cet UserWarning particulier en mettant

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

avant l'appel à str.contains.


Voici un exemple simple qui illustre le problème (et la solution):

# 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)]

impressions

  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)]

Suppression du groupe de capture du modèle d'expression régulière:

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

évite le UserWarning.

14
unutbu

L'autre moyen de se débarrasser de l'avertissement est de changer l'expression régulière afin qu'elle soit un groupe correspondant et non un groupe de capture. C'est le (?:) notation.

Ainsi, si le groupe correspondant est (url1|url2) il doit être remplacé par (?:url1|url2).

3
climatebrad

Puisque regex=True est fourni, sublist est traité comme une expression régulière, qui dans votre cas contient des groupes de capture (chaînes entre parenthèses).

Vous obtenez l'avertissement car si vous voulez capturer quelque chose, alors il n'y a pas d'utilisation de str.contains (qui renvoie booléen selon que le modèle fourni est contenu dans le chaîne ou non)

Évidemment, vous pouvez supprimer les avertissements mais il est préférable de les corriger.

Échappez aux blocs de parenthèses ou utilisez str.extract si vous voulez vraiment capturer quelque chose.

2
Chankey Pathak

vous devez utiliser re.escape(yourString) pour la chaîne à laquelle vous passez contient.

0
Rob