#pandas #dataframe
Вопрос:
Я начинаю с регулярного выражения, чтобы извлечь совпадения строк без чисел длиной 2 или более и соединить их, чтобы создать новое поле
import re
# testing regex here
part = '24C-435-SA'
part1 = '24CE-435-SA'
group = "-".join(re.findall(r'[A-za-z]{2,}', part))
group1 = "-".join(re.findall(r'[A-za-z]{2,}', part1))
print("Group:", group, "Group1:", group1)
и результат-Группа: SA Группа 1: CE-SA
Все хорошо, теперь я пытаюсь применить то же самое регулярное выражение к df фрейма данных pandas и сталкиваюсь с проблемами, как показано ниже
part unit_price
0 24C-435-SA 10
1 30C-435-SB 20
2 36C-435-SC 30
3 42C-435-SD 40
Теперь я пробую новую колонку:
df['group'] = "-".join(re.findall(r'[A-za-z]{2,}', str(df['part'])))
или даже другой синтаксис, чтобы избежать некоторых предупреждений панд:
df.loc[:, 'group'] = "-".join(re.findall(r'[A-za-z]{2,}', str(df['part'])))
и я понимаю это:
part unit_price group
0 24C-435-SA 10 SA-SB-SC-SD-Name-part-dtype-object
1 30C-435-SB 20 SA-SB-SC-SD-Name-part-dtype-object
2 36C-435-SC 30 SA-SB-SC-SD-Name-part-dtype-object
3 42C-435-SD 40 SA-SB-SC-SD-Name-part-dtype-object
Я вижу, что он продолжает объединять все совпадения строк вместо ожидаемых значений:
group
SA
SB
SC
SD
Ответ №1:
Вы можете попробовать с Series.str.findall
и Series.str.join
:
>>> df['group'] = df['part'].str.findall(r'[A-za-z]{2,}').str.join('-')
Комментарии:
1. Спасибо, Николаос, это тоже работает.
Ответ №2:
str(df['part'])
возвращает строковое представление ряда, а не то, что вы хотите.
Вы можете использовать apply
:
df['group'] = df['part'].apply(lambda x: "-".join(re.findall(r'[A-za-z]{2,}', x)))
Однако вы можете выполнять большинство операций с регулярными .str
выражениями с помощью . В вашем случае попробуйте:
df['group'] = (df['part'].str.extractall('([A-Za-z]{2,})')
.groupby(level=0)[0].agg('-'.join)
)
Комментарии:
1. Вот и все. Большое вам спасибо, Куанг Хоанг, за вашу помощь.