2 votes

Si la condition sur une colonne est vraie, alors trouver le motif sur une autre colonne et donner la sortie pandas

Voici les données sur lesquelles je travaille :

df_raw = pd.DataFrame({'Summary':['|ro-rd4_ae20|Issue-backfgound', '|20:36|site1_shutdown'], 'User':[r'UPC\User',r'UPC\Ankita'], 'Name':['Generic User', 'CSD']})

A l'aide d'une expression régulière, je souhaite vérifier séparément les motifs 'Nom' =CSD et 'Nom' = 'Utilisateur générique', ce qui créera une nouvelle colonne donnant la valeur true / false si le motif correspond à l'expression régulière.

Si df_raw.Name ='CSD' puis appliquer l'exp. rég. (df_raw['Summary'].str.findall(r'(([?:[01]?\d|2[0-9]):[0-9]\d|[a-z0-9A-Z-._]+)', expand=False))

y df_raw.Name = 'Generic User' puis appliquer le reg exp (df_raw['Summary'].str.findall(r'(([?:[01]?\d|2[0-9]):[0-9]\d|[a-z0-9A-Z-._]+)', expand=False))

J'ai essayé d'ajouter re dans la variable et de l'appliquer, mais cela ne m'aide pas/ne donne pas de résultat.

Aidez-nous à résoudre ce problème

2voto

Wiktor Stribiżew Points 100073

Vous pouvez utiliser

import pandas as pd
import re

df_raw = pd.DataFrame({'Summary':['|ro-rd4_ae20|Issue-backfgound', '|20:36|site1_shutdown'], 'User':[r'UPC\User',r'UPC\Ankita'], 'Name':['Generic User', 'CSD']})

def extract(r):
  if r["Name"] == "Generic User":
    return bool( re.search(r'(?:[01]?\d|2[0-9]):[0-9]\d|[a-z0-9A-Z._-]+', r["Summary"]) )
  elif r["Name"] == "CSD":
    return bool( re.search(r'(?:[01]?\d|2[0-9]):[0-9]\d|[a-z0-9A-Z._-]+', r["Summary"]) )
  return False

df_raw["Valid"] = df_raw.apply(extract, axis=1)

Sortie :

>>> df_raw
                         Summary        User          Name  Valid
0  |ro-rd4_ae20|Issue-backfgound    UPC\User  Generic User   True
1          |20:36|site1_shutdown  UPC\Ankita           CSD   True

En df_raw["Valid"] contiendra la colonne True o False valeurs.

Note : j'ai enlevé un "sauvage" [ au début de vos modèles, il semble décalé.

Si vous avez besoin de extraire les correspondances utiliser

def extract(r):
  if r["Name"] == "Generic User":
    m = re.search(r'(?:[01]?\d|2[0-9]):[0-9]\d|[a-z0-9A-Z._-]+', r["Summary"])
    if m: return m.group()
  elif r["Name"] == "CSD":
    m = re.search(r'(?:[01]?\d|2[0-9]):[0-9]\d|[a-z0-9A-Z._-]+', r["Summary"])
    if m: return m.group()
  return ''

>>> df_raw["Valid"] = df_raw.apply(extract, axis=1)
>>> df_raw
                         Summary        User          Name        Valid
0  |ro-rd4_ae20|Issue-backfgound    UPC\User  Generic User  ro-rd4_ae20
1          |20:36|site1_shutdown  UPC\Ankita           CSD        20:36
>>>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X