Pandas удаляет первый символ из столбца, если соблюдены условия

У меня есть серия, содержащая расширение номера телефона (в формате 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

Как установить значение только для этих результатов, чтобы удалить первый символ?

0
0
63
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я думаю, мы можем оставить первые 5 символов с правой стороны. Если это правильно, без других условий и эквивалентно вашим потребностям, то:

df['new'] = df['EXT'].apply(lambda x: x[-5:] if len(x) > 5 else x)

Но я также хочу отфильтровать, где находится первый символ x

Bijan 15.05.2024 00:21

@Бижан, можешь ли ты иметь расширения без x длиной более 5? Если нет, то это должно работать нормально (однако я бы использовал df['EXT'] = df['EXT'].str[-5:]). Если можете, то как следует обращаться с этими расширениями?

mozway 15.05.2024 05:55
Ответ принят как подходящий

Вы можете использовать нарезку строки (или 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

демо регулярного выражения

Я подумывал об использовании регулярного выражения... Я подозреваю, что маскирование и нарезка будут быстрее только потому, что регулярного выражения нет :)

Nick 15.05.2024 07:42

Другие вопросы по теме