Python панды, извлекающие слова из дефисов из клеток с фразами
У меня есть датафрейм, который содержит фразы, и я хочу извлечь из него только составные слова, разделенные дефисом, и поместить их в другой фрейм данных.
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'],})
Итак, вот что я получил:
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>.*)")
Результаты
>>> 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
То, что я хочу, это иметь только слово, чтобы оно было (обратите внимание, что Pok-e-mon выглядит как Nan
из-за 2 дефисов):
>>> new
part1 part2
0 Yellow Green
1 Jong il
2 NaN NaN
3 methyl butane
4 da derp
5 NaN NaN
2 ответа
Решение
Вы можете использовать это регулярное выражение:
(?:[^-\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
- Ваша первая проблема в том, что ничто не мешает
.
от скушных мест.[a-zA-Z]
выбирайте только буквы, чтобы избежать "прыжка" с одного слова на другое. - Для
pok-e-mon
В этом случае вам нужно проверить, нет ли дефиса до или после вашего матча.
Посмотреть демо здесь
Учитывая характеристики, я не вижу, где ваша первая строка Nan, Nan
идет от. Может быть, это опечатка в вашем примере? В любом случае, вот возможное решение.
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