У меня есть серия, содержащая расширение номера телефона (в формате x1234
). Однако наша система имеет ограничение в 5 символов.
Как удалить x
(первый символ), если длина строки равна 6?
Вот мой код:
mask1 = df['EXT'].str.startswith('x')
mask2 = df['EXT'].str.len() == 6
df[(mask1 & mask2)]['EXT'] # Apply both masks to only filter for these conditions and return the EXT
Как установить значение только для этих результатов, чтобы удалить первый символ?
Я думаю, мы можем оставить первые 5 символов с правой стороны. Если это правильно, без других условий и эквивалентно вашим потребностям, то:
df['new'] = df['EXT'].apply(lambda x: x[-5:] if len(x) > 5 else x)
@Бижан, можешь ли ты иметь расширения без x
длиной более 5? Если нет, то это должно работать нормально (однако я бы использовал df['EXT'] = df['EXT'].str[-5:]
). Если можете, то как следует обращаться с этими расширениями?
Вы можете использовать нарезку строки (или str.slice), чтобы обрезать первый символ, когда расширение соответствует вашим условиям. Например:
df = pd.DataFrame({ 'EXT' : ['x1234', 'x12345', '4555', 'x9902', '12345', 'x98765'] })
mask1 = df['EXT'].str.startswith('x')
mask2 = df['EXT'].str.len() == 6
df.loc[mask1 & mask2, 'EXT'] = df['EXT'].str[1:]
# or more long-winded
# df.loc[mask1 & mask2, 'EXT'] = df['EXT'].str.slice(1)
print(df)
Выход:
EXT
0 x1234
1 12345
2 4555
3 x9902
4 12345
5 98765
Вы можете объединить два условия в одном вызове str.replace:
df['EXT'] = df['EXT'].str.replace(r'x(.{5,})', r'\1', regex=True)
Пример (для ясности выведите как «EXT2»):
EXT EXT2
0 x1234 x1234
1 x12345 12345
2 123456 123456
Я подумывал об использовании регулярного выражения... Я подозреваю, что маскирование и нарезка будут быстрее только потому, что регулярного выражения нет :)
Но я также хочу отфильтровать, где находится первый символ
x