Извлеките регулярное выражение со специальным символом

#python #regex #pandas

Вопрос:

Я хочу создать столбец в фрейме данных pandas df на основе другого столбца ID . Для ID того , что содержит строку SAT , я хотел бы извлечь поплавки, соединенные специальным символом» -«, и поместить извлеченное в новый столбец с именем new_col . Если ID строка не содержит SAT , оставьте ее как NaN .

df как показано ниже:

     Date        ID                   Time
0   2007-01-10  SAT 1 HHSP           900
1   2007-01-10  DOUBLE 7 HHSP        900
2   2007-01-10  SAT GF-06-5CSBG.431  1000
3   2007-01-10  MA HYDRO HHSP        900
4   2007-01-10  2.233 HHSP           900
5   2007-01-10  SAT L2-15-3CSB1.252  1000
6   2007-01-10  SECTION 6 HHSP       900
 

Ожидаемый результат:

     Date        ID                   Time     new_col
0   2007-01-10  SAT 1 HHSP           900      NaN
1   2007-01-10  DOUBLE 7 HHSP        900      NaN
2   2007-01-10  SAT GF-06-5CSBG.431  1000     06-5
3   2007-01-10  MA HYDRO HHSP        900      NaN
4   2007-01-10  2.233 HHSP           900      NaN
5   2007-01-10  SAT L2-15-3 CSB1.252  1000    15-3  * In this case 15-3 instead of 2-15 is extracted because L2 is not completely floats.
6   2007-01-10  SECTION 6 HHSP       900      NaN
 

Ответ №1:

Используйте Series.str.extract с числами, объединенными - с - перед ним, и только для значений с SAT фильтром по Series.str.contains :

 m = df['ID'].str.contains('SAT')
df['new_col'] = df.loc[m, 'ID'].str.extract('[-s ](d -d )')
print (df)
         Date                   ID  Time new_col
0  2007-01-10           SAT 1 HHSP   900     NaN
1  2007-01-10        DOUBLE 7 HHSP   900     NaN
2  2007-01-10  SAT GF-06-5CSBG.431  1000    06-5
3  2007-01-10        MA HYDRO HHSP   900     NaN
4  2007-01-10           2.233 HHSP   900     NaN
5  2007-01-10  SAT L2-15-3CSB1.252  1000    15-3
6  2007-01-10       SECTION 6 HHSP   900     NaN
 

Если SAT возможно начало значения в столбце, используйте:

 df['new_col'] = df['ID'].str.extract('^SAT.*[-s ](d -d )', expand=False)
 

Комментарии:

1.Привет, израэль, спасибо за ваш ответ, ID SATGF 06-3 CSB G-407 вернулся NaN , хотя я ожидал, что он вернется 06-03 , так как есть 2 поплавка, к которым присоединился - персонаж. Это потому, что их 2 - ?

2. @nilsinelabore — затем используйте df.loc[m, 'ID'].str.extract('[-s ](d -d )') — тестовое пространство или - перед INT-INT числами