#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
числами