Python熊猫:获取组的第一个值

时间:2020-08-27 09:23:01

标签: python pandas pandas-groupby

我有一个这样记录的诊断列表:

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]
})

enter image description here

ID可以识别多个主题。对于每个受试者,可能会有一个或多个诊断。每个诊断都可以包含多个条目(因为要对多个事物进行重新记录(在此示例中不包含))。

DiagnosisTime可以(在某种程度上)标识单个诊断(具有多行)。但是,有时一种诊断的数据写入过程中会有一点延迟,因此在按DiagnosisTime分组时,我希望允许几秒钟的较小容差。

在此示例中,我希望得到如下结果:

enter image description here

ID的诊断有两种:1,第0、1、2和第3行。请注意,第2行的DiagnosisTime与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()

enter image description here

我认为我已经成功地在一个ID(不是完全确定石斑鱼)中确定了诊断,但是我不知道如何重置计数器。

如果这不可能,那么我将对一个函数返回一个ID且该组中diagnosis_number最低的所有记录感到满意。

1 个答案:

答案 0 :(得分:1)

您可以使用GroupBy.transformfactorize添加lambda函数:

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