为了账号安全,请及时绑定邮箱和手机立即绑定

Python pandas:获取组的第一个值

Python pandas:获取组的第一个值

梵蒂冈之花 2023-06-27 13:22:23
我有一份记录的诊断列表,如下所示: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。在此示例中,我想要的结果如下:1有两个诊断ID:第 0、1、2 行和第 3 行。请注意,DiagnosisTime第 2 行与第 0 行和第 1 行相比略有不同ID。2 由第 4 行和第 5 行组成的 1 个诊断组成。对于每个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。
查看完整描述

1 回答

?
慕运维8079593

TA贡献1876条经验 获得超5个赞

GroupBy.transform您可以使用and添加 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


查看完整回答
反对 回复 2023-06-27
  • 1 回答
  • 0 关注
  • 136 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信