панды с регулярным выражением для вычисляемого столбца

#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. Вот и все. Большое вам спасибо, Куанг Хоанг, за вашу помощь.