我有一个这样记录的诊断列表:
df = pd.DataFrame({
"DiagnosisTime": ["2017-01-01 08:23:00", "2017-01-01 08:23:00", "2017-01-01 08:23:03", "2017-01-01 08:27:00", "2019-12-31 20:19:39", "2019-12-31 20:19:39"],
"ID": [1,1,1,1,2,2]
})
可以识别多个主题ID
。对于每个受试者,可能会有一个或多个诊断。每个诊断都可以包含多个条目(因为要对多个事物进行重新记录(在此示例中未列出))。
单个诊断(具有多行)可以(在某种程度上)由识别DiagnosisTime
。但是,有时一种诊断的数据写入过程中会有一点延迟,因此我希望在按分组时允许几秒钟的较小容差DiagnosisTime
。
在此示例中,我希望得到如下结果:
对于ID
1:行0、1、2和第3行有两种诊断。请注意DiagnosisTime
,第2行与0和1略有不同ID
。2由1行4和5组成的诊断组成。
对于每个ID
我想将计数器设置回1(如果更简单,则设置为0)。
这是我走了多远:
df["DiagnosisTime"] = pd.to_datetime(df["DiagnosisTime"])
df["diagnosis_number"] = df.groupby([pd.Grouper(freq='5S', key="DiagnosisTime"), 'ID']).ngroup()
我认为我成功地在一个诊断程序中找到了诊断信息ID
(对石斑鱼并不完全确定),但是我不知道如何重置计数器。
如果不可能,那么我也将对一个函数感到满意,该函数返回该组ID
中具有最低记录的所有记录diagnosis_number
。
您可以使用GroupBy.transform
和添加lambda函数factorize
:
df["diagnosis_number"] = (df.groupby('ID')['diagnosis_number']
.transform(lambda x: pd.factorize(x)[0]) + 1)
print (df)
DiagnosisTime ID diagnosis_number
0 2017-01-01 08:23:00 1 1
1 2017-01-01 08:23:00 1 1
2 2017-01-01 08:23:03 1 1
3 2017-01-01 08:27:00 1 2
4 2019-12-31 20:19:39 2 1
5 2019-12-31 20:19:39 2 1
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句