Использование регулярных выражений для распознавания шаблонов и очистки данных в столбцах панд - PullRequest
3 голосов
/ 21 апреля 2019

У меня есть набор данных, который содержит инновационные данные компаний, используя некоторое регулярное выражение, я хочу получить данные лицензии

company licences/patents
1       UX226, licence-pp-zz, licence-zz-pp, licence-xx-tt
2       VV3346E, SS345
3       licence-dd-zz
4       UT223, licence, ss
5       XBTYU, licence-tt-kk, licence-ss-tt
6       xc, zz
7       licence-xb-xz

Желаемый вывод:

company licences/patents                                    licence
1       UX226, licence-pp-zz, licence-zz-pp, licence-xx-tt  licence-pp-zz, licence-zz-pp, licence-xx-tt 
2       VV3346E, SS345
3       licence-dd-zz                                       licence-dd-zz
4       UT223, licence, ss
5       XBTYU, licence-tt-kk, licence-ss-tt                 licence-tt-kk, licence-ss-tt
6       xc, zz
7       licence-xb-xz                                       licence-xb-xz

Ответы [ 5 ]

3 голосов
/ 21 апреля 2019

Вы можете попробовать:

df['licence'] = df['licences/patents'].str.extractall('(licence-\w{2}-\w{2})')\
  .unstack().apply(lambda x: ', '.join(x.dropna()), axis=1)

Выход:

   company                                   licences/patents                                      licence
0        1  UX226, licence-pp-zz, licence-zz-pp, licence-x...  licence-pp-zz, licence-zz-pp, licence-xx-tt
1        2                                     VV3346E, SS345                                          NaN
2        3                                      licence-dd-zz                                licence-dd-zz
3        4                                 UT223, licence, ss                                          NaN
4        5                XBTYU, licence-tt-kk, licence-ss-tt                 licence-tt-kk, licence-ss-tt
5        6                                             xc, zz                                          NaN
6        7                                      licence-xb-xz                                licence-xb-xz
2 голосов
/ 21 апреля 2019

Другой подход, использующий Series.str.findall и Series.str.join:

df['licence'] = df['licences/patents'].str.findall(r'(licence[^,]*)').str.join(', ')

[out]

   company                                   licences/patents  \
0        1  UX226, licence-pp-zz, licence-zz-pp, licence-x...   
1        2                                     VV3346E, SS345   
2        3                                      licence-dd-zz   
3        4                                 UT223, licence, ss   
4        5                XBTYU, licence-tt-kk, licence-ss-tt   
5        6                                             xc, zz   
6        7                                      licence-xb-xz   

                                       licence  
0  licence-pp-zz, licence-zz-pp, licence-xx-tt  
1                                               
2                                licence-dd-zz  
3                                      licence  
4                 licence-tt-kk, licence-ss-tt  
5                                               
6                                licence-xb-xz  
1 голос
/ 21 апреля 2019

Попробуйте код ниже:

df['licences/patents'].str.findall('(licence-[\w\-]+)').apply(", ".join)

1 голос
/ 21 апреля 2019

df['license'] = df['licences/patents'].apply(lambda x: ''.join(re.findall('lice.*',x)))

Будет создан новый столбец лицензии с лицензиями, удаленными из исходного столбца.

1 голос
/ 21 апреля 2019

Этот RegEx может помочь вам создать одну группу, $1, где ваш желаемый результат может быть:

(licence-[a-z]{2}-[a-z]{2})

RegEx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...