сбор значений из разных строк/столбцов в одну строку по уникальному идентификатору
Есть лог программы (пишется просто строкой, без сепараторов Оо) - данный лог собрал в датафрейм 17 столбцов >25000 строк. (самый маленький лог) В логе записаны состояние процессов в различное время, уникальный идентификатор - id процесса. На разных этапах жизни процесса он генерирует различные статусы.
ID status1 status2 status3 status4
0 1 ok
1 2
2 3 ok
3 1 ok
4 3 ok
5 1 ok
6 2 ok ok
7 3
8 1 ok
9 3 ok
10 3
11 2
Код датафрейма для примера.
data = {'ID':[1,2,3,1,3,1,2,3,1,3,3,2],
'status1':['ok','','','','ok','','','','','','',''],
'status2':['','','','ok','','ok','ok','','','','',''],
'status3':['','','ok','','','','','','','','',''],
'status4':['','','','','','','ok','','ok','ok','','']}
ttf = pd.DataFrame(data)
Хочу получить датафрейм вида:
ID status1 status2 status3 status4
0 1 ok ok ok
1 2 ok ok
2 3 ok ok ok
Одна строка ID и все заполненные статусы которые есть. По каждому id. Сижу, туплю - укажите нужный путь =)
Ответы (1 шт):
Просто группируете по ID и берёте максимум по каждой колонке в группе. Строка'ok' считается больше, чем пустая строка '' (любая не пустая строка больше, чем пустая), поэтому это сработает.
ttf.groupby('ID').max()
| ID | status1 | status2 | status3 | status4 |
|---|---|---|---|---|
| 1 | ok | ok | ok | |
| 2 | ok | ok | ||
| 3 | ok | ok | ok |
А если вдруг статус будет не один, а разные, и хочется видеть все эти статусы списком без повторов, то могу предложить вот такую хитрую аггрегацию вместо .max:
.agg(lambda x: ','.join(set(filter(None, x))) or '')