Я пытаюсь объединить некоторые данные с pandas, чтобы я создал два новых столбца, в которых хранятся значения из исходного набора данных, чтобы уменьшить количество общих строк.
Например
d = pd.DataFrame([['0001', None, 'backlog', '2020-01-15', '2020-01-31'],
['0001', 'backlog', 'complete', '2020-01-31', '9999-12-31'],
['0001', 'backlog', 'complete', '2020-01-31', '9999-12-31'],
['0002', None, 'backlog', '2019-02-15', '2019-02-25'],
['0002', None, 'backlog', '2019-02-15', '2019-02-25'],
['0002', None, 'backlog', '2019-02-15', '2019-02-25'],
['0002', None, 'backlog', '2019-02-15', '2019-02-25'],
['0002', 'backlog', 'complete', '2019-02-25', '9999-12-31'],
['0003', None, 'backlog', '2020-01-15', '2020-01-31'],
['0003', None, 'backlog', '2020-01-15', '2020-01-31'],
['0003', None, 'backlog', '2020-01-15', '2020-01-31'],
['0003', 'backlog', 'modified', '2020-01-31', '2020-02-05'],
['0003', 'modified', 'qe_backlog', '2020-02-05', '2020-02-20'],
['0003', 'qe_backlog', 'verified', '2020-02-20', '9999-12-31']] ,
columns=['id', 'old_state', 'new_state', 'start_dttm', 'end_dttm'])
приводит к
id old_state new_state start_dttm end_dttm
0 0001 None backlog 2020-01-15 2020-01-31
1 0001 backlog complete 2020-01-31 9999-12-31
2 0001 backlog complete 2020-01-31 9999-12-31
3 0002 None backlog 2019-02-15 2019-02-25
4 0002 None backlog 2019-02-15 2019-02-25
5 0002 None backlog 2019-02-15 2019-02-25
6 0002 None backlog 2019-02-15 2019-02-25
7 0002 backlog complete 2019-02-25 9999-12-31
8 0003 None backlog 2020-01-15 2020-01-31
9 0003 None backlog 2020-01-15 2020-01-31
10 0003 None backlog 2020-01-15 2020-01-31
11 0003 backlog modified 2020-01-31 2020-02-05
12 0003 modified qe_backlog 2020-02-05 2020-02-20
13 0003 qe_backlog verified 2020-02-20 9999-12-31
В конце я хотел бы получить:
id state backlog_dttm completed_dttm modified_dttm qe_backlog_dttm verified_dttm
0001 complete 2020-01-15 2020-01-31 null null null
0002 complete 2019-02-15 2019-02-25 null null null null
0003 verified 2020-01-15 null 2020-01-31 2020-02-05 2020-02-20
Пока у меня есть
d.drop_duplicates(subset=d.columns, keep='last', inplace=True)
d.set_index('id', inplace=True)
Тогда в В этот момент, пытаясь установить backlog_dttm, все перестает работать.
d2['backlog_dttm'] = d[d['old_state'].isnull() & (d['new_state'] == 'backlog')]['start_dttm']
d2 = d.loc[d['end_dttm'] == d.end_dttm.max()]
d2.loc[d2.index,'backlog_dttm'] = d[d['old_state'].isnull() & (d['new_state'] == 'backlog')]['start_dttm']
d2.loc[d2.index, 'completed_dttm'] = d[d['new_state'] == 'complete']['start_dttm']
d2.loc[d2.index, 'modified_dttm'] = d[d['new_state'] == 'modified']['start_dttm']
d2.loc[d2.index, 'qe_backlog_dttm'] = d[d['new_state'] == 'qe_backlog']['start_dttm']
Вышеуказанное приводит к SettingWithCopyWarning, но, похоже, работает. Окончательный желаемый результат должен выглядеть примерно так:
old_state new_state start_dttm end_dttm backlog_dttm \
id
0001 backlog complete 2020-01-31 9999-12-31 2020-01-15
0002 backlog complete 2019-02-25 9999-12-31 2019-02-15
0003 qe_backlog verified 2020-02-20 9999-12-31 2020-01-15
completed_dttm modified_dttm qe_backlog_dttm
id
0001 2020-01-31 NaN NaN
0002 2019-02-25 NaN NaN
0003 NaN 2020-01-31 2020-02-05
В качестве справки: это всего лишь пример, реальный набор данных основан на рабочем процессе разработки, в котором будут другие состояния, такие как ready_to_test, Verified, in_progress. , et c ... и аналогичным образом, для этих состояний также должны быть столбцы, которые необходимо заполнить, то есть Verified_dttm, read_to_test_dttm ..
Поля start_dttm и end_dttm используются для определения даты, когда была введена запись данное состояние и дата выхода из этого состояния.
Любые мысли / предложения приветствуются. -Спасибо!