#python #pandas
#python #pandas
Вопрос:
У меня есть фрейм данных, как показано ниже (коды фреймов данных R и Python приведены ниже)
df = pd.DataFrame({'person_id': [11,11,11,12,12,12,12,13,13,13,13,13,14,14,14]})
df['enc_id'] = [1134567890,1134567890,1134567890,3456789210,3456789210,3456789210,3456789210,5643271890,5643271890,5643271890,5643271890,5643271890,2468013579,2468013579,2468013579]
person_id <- c(11,11,11,12,12,12,12,13,13,13,13,13,14,14,14)
enc_id <- c(1134567890,1134567890,1134567890,3456789210,3456789210,3456789210,3456789210,5643271890,5643271890,5643271890,5643271890,5643271890,2468013579,2468013579,2468013579)
df <- data.frame(person_id, enc_id)
Я хотел бы присвоить порядковый номер enc_id
каждому человеку
Я написал что-то вроде приведенного ниже на Python
df['new_enc_id'] = df['enc_id'].map(str) (df.groupby('person_id').cumcount() 1).map(str)
Можете ли вы помочь мне с приведенными ниже вопросами?
-
Как я могу это сделать в R?
-
Есть какой-нибудь элегантный способ сделать это на Python?
Я ожидаю, что мой результат будет таким, как показано ниже. Вы можете видеть, что sequence number
это объединяется для каждой группы и not added
.
Ответ №1:
Ваше решение хорошее, я использую только astype
для преобразования в строки:
df['new_enc_id'] = (df['enc_id'].astype(str)
(df.groupby('person_id').cumcount() 1).astype(str))
Ответ №2:
В R
df = df %>% group_by(person_id) %>% dplyr::mutate(new_enc_id = paste0(enc_id,row_number()) )
Комментарии:
1. Могу ли я узнать, почему между и есть пробел
enc_id
sequence number
?2. @TheGreat измените вставку на paste0 ~
Ответ №3:
Базовый параметр R с использованием transform
ave
df <- transform(
df,
new_enc_id = paste0(new_enc_id, ave(1:nrow(df), person_id, FUN = seq_along))
)
Ответ №4:
в R
пространстве вы могли бы получить тот же результат с data.table
:
setDT(df)
df[, paste0(enc_id,row.names(.SD)), by=person_id]
Для решения python достаточно решения @jezrael.