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í