У меня есть идентификатор столбца, который состоит из 10
чисел или 7
чисел. Я хотел бы создать новый столбец, который будет содержать последние 3 числа/цифры, если идентификатор столбца содержит len=10, в противном случае я хотел бы сохранить число, которое было в идентификаторе столбца.
DF['ID']= ['5487123500', '6287467', '5487123240', '6366584', '5487123260' ]
ИСХОД:
DF['NEW_ID']= ['500', '6287467', '240', '6366584', '260']
Я пробовал с re и lambas, но это не сработало.
Вы можете использовать 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
Обновлено: Если ваш столбец ID
int
, сделайте следующее:
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)
Этот ответ намного лучше, чем принятый, plus1
Вы можете попробовать это -
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() получил неожиданный аргумент ключевого слова «ось»
Да, понял это, обновил код, чтобы он теперь работал
df['NEW_ID'] = df['ID'].apply(lambda x : x[-3:] if len(x)==10 else x)
Производительность apply
медленнее по сравнению с np.where
.
Это выглядит хорошо, но у меня есть следующая ошибка: можно использовать только аксессор .str со строковыми значениями!