我有一份記錄的診斷列表,如下所示: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
添加回答
舉報
0/150
提交
取消