Извлечение N чисел в новый столбец в Python

У меня есть идентификатор столбца, который состоит из 10 чисел или 7 чисел. Я хотел бы создать новый столбец, который будет содержать последние 3 числа/цифры, если идентификатор столбца содержит len=10, в противном случае я хотел бы сохранить число, которое было в идентификаторе столбца.

DF['ID']= ['5487123500', '6287467', '5487123240', '6366584', '5487123260' ]

ИСХОД:

DF['NEW_ID']= ['500', '6287467', '240', '6366584', '260']

Я пробовал с re и lambas, но это не сработало.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
83
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать numpy.where с Series.str.len, чтобы проверить length каждого значения:

In [869]: df
Out[869]: 
           ID
0  5487123500
1     6287467
2  5487123240
3     6366584
4  5487123260

In [872]: import numpy as np

In [873]: df['new ID'] = np.where(df['ID'].str.len().eq(10), df['ID'].str[-3:], df['ID'])

In [874]: df
Out[874]: 
           ID   new ID
0  5487123500      500
1     6287467  6287467
2  5487123240      240
3     6366584  6366584
4  5487123260      260

Обновлено: Если ваш столбец IDint, сделайте следующее:

In [881]: df['ID'] = df['ID'].astype(str)
In [873]: df['new ID'] = np.where(df.ID.str.len().eq(10), df.ID.str[-3:], df.ID)

Это выглядит хорошо, но у меня есть следующая ошибка: можно использовать только аксессор .str со строковыми значениями!

AlexGo 15.12.2020 12:19

Этот ответ намного лучше, чем принятый, plus1

jezrael 15.12.2020 15:35

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

DF['ID']= ['5487123500', '6287467', '5487123240', '6366584', '5487123260' ]

def filter_id(inp):
    res = list()
    for val in inp:
        if len(val) >= 10:
           return val[-3:]
        else:
           return val

DF['NEW_ID']= DF[['ID']].apply(filter_id,axis=1)

Привет спасибо. Я попробовал это, и он показывает мне следующую ошибку: TypeError: filter_id() получил неожиданный аргумент ключевого слова «ось»

AlexGo 15.12.2020 12:21

Да, понял это, обновил код, чтобы он теперь работал

Vaebhav 15.12.2020 12:32
Ответ принят как подходящий

Однолинейное решение

df['NEW_ID']  =  df['ID'].apply(lambda x : x[-3:] if len(x)==10 else x)

Производительность apply медленнее по сравнению с np.where.

Mayank Porwal 15.12.2020 12:43

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