#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