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?
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.
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)
.
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.
vous devez utiliser re.escape(yourString)
pour la chaîne à laquelle vous passez contient.