Сопоставление порядкового номера с каждой строкой в группе с использованием Pandas и R

#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)
  

Можете ли вы помочь мне с приведенными ниже вопросами?

  1. Как я могу это сделать в R?

  2. Есть какой-нибудь элегантный способ сделать это на 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.