Преобразование кадра данных из длинного в широкое с сохранением порядка значений (тип-даты-время) - PullRequest
0 голосов
/ 03 января 2019

У меня есть фрейм данных с именем df, который выглядит примерно так (за исключением того, что количество записей в столбце Visit Date, связанных с каждым Client ID, достигает 74, и существует несколько сотен уникальных Client IDs - I упростили это здесь).

Visit Date  Client ID
2016-05-25  C1009404
2016-06-30  C1009404
2016-07-14  C1009404
2016-07-20  C1009405
2016-08-03  C1009405
2016-08-08  C1009405
2016-08-10  C1009405
2016-08-15  C1009406
2016-08-17  C1009406
2016-08-24  C1009406

Я хочу преобразовать его из длинного в широкое, чтобы оно выглядело так:

Client ID  Visit_1     Visit_2     Visit_3     Visit_4
C1009404   2016-05-25  2016-06-30  2016-07-14
C1009405   2016-07-20  2016-08-03  2016-08-08  2016-08-10
C1009406   2016-08-15  2016-08-17  2016-08-24

Я попробовал следующий код:

df_wide = df.groupby(['Client ID'], as_index=False).agg(lambda x: ', '.join(set(x.astype(str))))
df_wide = pd.concat([df_wide[['Client ID','ENROLLED_DT']], df_wide['VISIT_DT'].str.split(',', expand=True)], axis=1)
df_wide = df_wide.rename(columns={0: 'Visit_1', 1: 'Visit_2', 2: 'Visit_3', 3: 'Visit_4'})

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

1 Ответ

0 голосов
/ 03 января 2019

Вам может понадобиться создать еще один ключ для помощи pivot

df.assign(key=df.groupby('ClientID').cumcount()+1).\
    pivot('ClientID','key','VisitDate').\
      fillna('').\
        add_prefix('Visit_')
Out[152]: 
key           Visit_1     Visit_2     Visit_3     Visit_4
ClientID                                                 
C10094042  2016-05-25  2016-06-30  2016-07-14            
C10094056  2016-07-20  2016-08-03  2016-08-08  2016-08-10
C10094061  2016-08-15  2016-08-17  2016-08-24  
...