to_html str dropna python regex pandas nlp

str - Pandas Python extrayendo palabras con guiones de las celdas con frases



pandas str extract (2)

Tengo un marco de datos que contiene frases y quiero extraer solo palabras compuestas separadas por un guión del marco de datos y ubicarlas en otro marco de datos.

df=pd.DataFrame({''Phrases'': [''Trail 1 Yellow-Green'',''Kim Jong-il was here'', ''President Barack Obama'', ''methyl-butane'', ''Derp da-derp derp'', ''Pok-e-mon''],})

Hasta ahora, esto es lo que obtuve hasta ahora:

import pandas as pd df=pd.DataFrame({''Phrases'': [''Trail 1 Yellow-Green'',''Kim Jong-il was here'', ''President Barack Obama'', ''methyl-butane'', ''Derp da-derp derp'', ''Pok-e-mon''],}) new = df[''Phrases''].str.extract("(?P<part1>.*?)-(?P<part2>.*)")

resultados

>>> new part1 part2 0 Trail 1 Yellow Green 1 Kim Jong il was here 2 NaN NaN 3 methyl butane 4 Derp da derp derp 5 Pok e-mon

Lo que quiero es tener solo la palabra para que así sea (tenga en cuenta que Pok-e-mon aparece como Nan debido a 2 guiones):

>>> new part1 part2 0 Yellow Green 1 Jong il 2 NaN NaN 3 methyl butane 4 da derp 5 NaN NaN


Dadas las especificaciones, no veo de dónde viene tu primera línea de Nan, Nan . Tal vez es un error tipográfico en tu ejemplo? De todos modos, aquí hay una posible solución.

import re # returns words with at least one hyphen def split_phrase(phrase): return re.findall(''(/w+(?:-/w+)+)'', phrase) # get all words with hyphens words_with_hyphens = sum(df.Phrases.apply(split_phrase).values) # split all words into parts split_words = [word.split(''-'') for word in words_with_hyphens] # keep words with two parts only, else return (Nan, Nan) new_data = [(ws[0], ws[1]) if len(ws) == 2 else (np.nan, np.nan) for ws in split_words] # create the new DataFrame pd.DataFrame(new_data, columns=[''part1'', ''part2'']) # part1 | part2 #------------------ # 0 Yellow | Green # 1 Jong | il # 2 methyl | butane # 3 da | derp # 4 NaN | NaN


Puedes usar esta expresión regular:

(?:[^-/w]|^)(?P<part1>[a-zA-Z]+)-(?P<part2>[a-zA-Z]+)(?:[^-/w]|$) (?: # non capturing group [^-/w]|^ # a non-hyphen or the beginning of the string ) (?P<part1> [a-zA-Z]+ # at least a letter )-(?P<part2> [a-zA-Z]+ ) (?:[^-/w]|$) # either a non-hyphen character or the end of the string

  • Tu primer problema es que nada impide que . de comer espacios. [a-zA-Z] solo selecciona letras para evitar "saltos" de una palabra a otra.
  • Para el caso pok-e-mon , debe verificar que no haya un guion justo antes o después de su coincidencia.

Vea la demostración aquí