Выравнивание данных по идентификатору

#python #pandas

Вопрос:

У меня есть таблица данных, которая выглядит следующим образом (обратите внимание, что это сокращено, есть некоторый идентификатор с более чем 2 раза):

 ID        TIME
1         10:12
1         4:43
2         9:12
3         1:43
3         16:47
4         2:55
 

Я хотел бы сгладить его, чтобы он выглядел так:

 ID  Time_1    Time_2
1     10:12    4:43
2     4:43
3     1:43     16:47
4     2:55
 

Я рассматриваю варианты «сглаживания», но еще не нашел правильного ответа.

https://pandas.pydata.org/pandas-docs/version/0.14.1/generated/pandas .Index.flatten.html

Ответ №1:

Попробуйте groupby и объедините свои строки

 new = df.groupby('ID')['TIME'].agg(' '.join).str.split(expand=True)
new.columns = [f'Time_{col 1}' for col in new.columns] # rename columns

   Time_1 Time_2
ID              
1   10:12   4:43
2    9:12   None
3    1:43  16:47
4    2:55   None
 

Ответ №2:

Чтобы отформатировать точно в требуемом формате, вы можете использовать .pivot() следующее:

 (df.assign(serial='Time_' df.groupby('ID').cumcount().add(1).astype(str))
   .pivot(index='ID', columns='serial', values='TIME')
   .rename_axis(columns=None)
   .reset_index()
)
 

Результат:

    ID Time_1 Time_2
0   1  10:12   4:43
1   2   9:12    NaN
2   3   1:43  16:47
3   4   2:55    NaN
 

Если вы хотите, чтобы отсутствующие значения отображались как пустые, вы можете использовать:

 (df.assign(serial='Time_' df.groupby('ID').cumcount().add(1).astype(str))
   .pivot(index='ID', columns='serial', values='TIME').fillna('')
   .rename_axis(columns=None)
   .reset_index()
)
 

Результат:

    ID Time_1 Time_2
0   1  10:12   4:43
1   2   9:12       
2   3   1:43  16:47
3   4   2:55