如何根据另一列中的值将值移动到新列中

How to move values into new columns based on values in another column

我有一组患者观察 (Obs)(例如血压、心率、呼吸率等)(这并不详尽,可以更改为我需要通过从中提取唯一值来生成此列表Obs 列)。

目前每行数据代表一个值,对应于应该记录的时间点、记录的时间和患者就诊ID。

我想重新排列,以便在每个时间点对每个患者进行的所有观察(来自原始 Obs 列的唯一值)出现在一行上。有时在某个时间点会采用两个值进行观察 - 在这种情况下,我想采用 later.Sometimes 在那个时间点未记录观察结果,在这种情况下 return NaN(或其他空值) .

如果数据文件为 22GB,那么尽可能高效地执行此操作将不胜感激!

示例数据

Index, VisitID, Obs, Obs_DTM, Entered_DTM, Value

0, 33, BP, 2018-11-06 20:30:00, 2018-11-06 20:31:08, 120

1, 33, HR, 2018-11-06 20:30:00, 2018-11-06 20:31:12, 98

2, 33, SPO2, 2018-11-06 20:30:00, 2018-11-06 20:31:14, 99

3, 33, RR, 2018-11-06 20:30:00, 2018-11-06 20:31:10, 104

4, 33, RR, 2018-11-06 20:30:00, 2018-11-06 20:32:00, 22

5, 33, RR, 2018-07-23 21:28:00, 2018-07-23 21:32:10, 20

6, 33, BP, 2018-07-23 21:28:00, 2018-07-23 21:32:15, 102

7, 34, BP, 2018-07-25 20:32:00, 2018-07-25 21:42:07, 98

8, 34, GCS, 2018-07-25 20:32:00, 2018-07-25 21:42:10,  12

9, 34, HR, 2018-07-25 20:32:00, 2018-07-25 21:41:58, 99

10, 34, SpO2,2018-07-25 20:32:00, 2018-07-25 21:42:15, 89

11, 34, RR, 2018-07-25 20:32:00, 2018-07-25 21:42:12, 13

12, 34, GCS, 2018-07-25 22:54:00, 2018-07-25 22:52:00, 14 

Return

Index, VisitID, Obs_DTM, BP_Value, BP_DTM, HR_Value, HR_DTM, SPO2_Value, SPO2_DTM, RR_Value, RR_DTM, GCS_Value, GCS_DTM

0, 33, 2018-11-06 20:30:00,120, 2018-11-06 20:31:08, 98, 2018-11-06 20:31:12, 99, 2018-11-06 20:31:14, 22, 2018-11-06 20:32:00, NaN, NaN

1, 33, 2018-07-23 21:28:00, 102, 2018-07-23 21:32:15, NaN, NaN, NaN, NaN, 2018-07-23 21:32:10, 20, NaN, NaN

2, 34, 2018-07-25 20:32:00, 98, 2018-07-25 21:42:07, 99, 2018-07-25 21:41:58, 89, 2018-07-25 21:42:15, 13, 2018-07-25 21:42:12, 2018-07-25 21:42:10, 12

3, 34, 2018-07-25 22:54:00, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 14, 2018-07-25 22:52:00

在此先感谢您的帮助。

我们可以做到:

#only if index is a columns
#df = df.set_index('Index')

new_df = df.pivot_table(index=['VisitID', 'Obs_DTM'],
                        columns='Obs',
                        aggfunc='first')
new_df = new_df.set_axis([f'{y}_{x}' for x, y in new_df.columns], axis=1).reset_index()