如何根据另一列中的值将值移动到新列中
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()
我有一组患者观察 (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()