J'essaie d'extraire les noms du texte Twitter à l'aide de regex. Mais, malgré le modèle, la valeur renvoyée est aucune, ce qui n'est pas exactement le cas. Là où mon code est erroné, je n'en ai aucune idée. J'utilise jupyter lab.
Exemple de texte: pd.Series full_text
0 None 1 None 2 None 3 None 4 None ... 21299 None 21300 None 21301 None 21302 None 21303 None Name: full_text, Length: 21304, dtype: object
Ma fonction définie est la suivante:
XXX
Et, j'applique la fonction ci-dessus comme ci-dessous:
full_text.apply(extract_user)
Mais les valeurs que j'obtiens en retour sont les suivantes: p >
def extract_user(text): m = re.search(r"RT\s@\w+:", text) return m
3 Réponses :
Vous pouvez faire beaucoup plus simplement avec le code ci-dessous
0 0 SeamusHughes 1 WFaqiri 2 DavidCornDC 3 DavidCornDC 4 billroggio 5 billroggio 6 KFILE
Sortie
0 0 @SeamusHughes 1 @WFaqiri 2 @DavidCornDC 3 @DavidCornDC 4 @billroggio 5 @billroggio 6 @KFILE
Si vous le souhaitez seulement les noms et pas le symbole @
, utilisez df.A.str.extract(r"@(\w+)")
Sortie
df.A.str.extract(r"(@\w+)") #A is the column name
Merci! tous vos codes sont formidables, mais je serais très obligé si quelqu'un peut signaler l'erreur dans mon code.
Dans votre code, re.search (r "RT \ s @ \ w +:", text)
renvoie l'objet de recherche, pas la valeur. Imprimez m
et imprimez m.group ()
pour voir la différence.
@ambrishdhaka (1) en utilisant fulltext.str
au lieu de fulltext
puis (2) en utilisant un groupe de capture pour saisir le texte réel.
@moys J'ai appris cela de vous m = re.search (r "RT \ s @ \ w +:", text) print (m.group () [4: -1])
merci .
Que diriez-vous de quelque chose comme ça en utilisant une fonction lambda en son sein:
import pandas as pd data = [['RT @SeamusHughes: The Taliban Stamp of approva...'],['RT @WFaqiri: Taliban and Afghan groups find co...'],['RT @DavidCornDC: Imagine what Fox News would h...'],['RT @DavidCornDC: Imagine what Fox News would h...'],['RT @billroggio: Even if you are inclined to tr...'],['RT @billroggio: I am sure we will hear the arg...'],['RT @KFILE: This did happen and it went exactly...']] df=pd.DataFrame(data) df[0].apply(lambda text: re.search(r'RT\s@([^:]+)',text).group(1)) # 0 SeamusHughes # 1 WFaqiri # 2 DavidCornDC # 3 DavidCornDC # 4 billroggio # 5 billroggio # 6 KFILE # Name: 0, dtype: object
Et en mettant tout cela ensemble pour la minutie:
>>> df[0].apply(lambda text: re.search(r'RT\s@([^:]+)',text).group(1)) 0 SeamusHughes 1 WFaqiri 2 DavidCornDC 3 DavidCornDC 4 billroggio 5 billroggio 6 KFILE
Merci! les fonctions anonymes sont excellentes, mais la chaîne de regex que vous avez utilisée devrait également fonctionner dans mon code. Je l'ai essayé en le remplaçant par le vôtre, mais sans succès.
La raison pour laquelle cela se produit est que votre fonction ( extract_user
) renvoie:
def extract_user(text): m = re.search(r"RT\s@\w+:", text) return m[0] # <-- here stuff = df.iloc[:, 0].apply(extract_user) print(stuff) 0 RT @SeamusHughes: 1 RT @WFaqiri: 2 RT @DavidCornDC: 3 RT @DavidCornDC: 4 RT @billroggio: 5 RT @billroggio: 6 RT @KFILE:
Maintenant, je ne suis pas un expert alors prenez cela avec un grain de sel, mais je suppose que les pandas n'ont pas de dtype
pour gérer l'objet
renvoyé par votre fonction et qu'il le gère avec None code>. Consultez cette excellente réponse si vous souhaitez approfondir géré les dtypes.
Donc, en supposant que vous vouliez garder toute votre approche la même avec des changements minimes, voici un exemple de votre fonction modifiée en renvoyant simplement le premier élément ( [0] code>) de chaque objet
.
0 <re.Match object; span=(5, 22), match='RT @Sea... 1 <re.Match object; span=(5, 17), match='RT @WFa... 2 <re.Match object; span=(5, 21), match='RT @Dav... 3 ...
J'espère que cela clarifie les choses.
Merci! J'ai compris cela aussi, puis j'ai utilisé le tranchage comme return m.group () [4: -1]
.
re.search renvoie l'objet de correspondance
presque la même syntaxe avec
pandas
:full_text.str.match ("RT \ s @ \ w +:")