Pandas与群居动物合而为一

2024-06-11 16:29:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有如下两个数据帧

admit = pd.DataFrame({"HN": ["001", "002", "001", "002"],
                      "dob": ["1999-05-25", "1979-08-12", "1999-05-25", "1979-08-12"],
                      "dateadm": ["2000-11-10", "2012-07-11", "2014-04-02", "2016-03-05"]})

admit["dateadm"] = pd.to_datetime(admit["dateadm"], format="%Y-%m-%d")

lab = pd.DataFrame({"HN": ["001", "002", "001", "002", "001"],
                    "labdate":["2000-11-11", "2012-07-13", "2000-11-15", "2016-03-05", "2014-04-02"],
                    "FPG": [100.0, 120.0, 95.5, 125.0, 99.0]})

lab["labdate"] = pd.to_datetime(lab["labdate"], format="%Y-%m-%d")
lab = lab.sort_values(by="labdate").reset_index(drop=True)

我想将承认和实验室合并在一起,将任何实验室日期的FPG平均值取到最近的日期adm。基本上,任何dateadm的labdate都应该与该dataadm的日期相同或较晚。我能想到这个命令

data = pd.merge_asof(admit, lab, left_on="dateadm", right_on="labdate", by="HN", direction="forward")

我得到了如下返回的输出

 HN       dob        dateadm     labdate      FPG
001   1999-05-25   2000-11-10   2000-11-11   100.0
002   1979-08-12   2012-07-11   2012-07-13   120.0
001   1999-05-25   2014-04-02   2014-04-02    99.0
002   1979-08-12   2016-03-05   2016-03-05   125.0

但是,带有dateadm 2000-11-10的HN 001有两个最接近的labdate 2000-11-11和2000-11-15。因此,第一行的FPG值应为100.0和95.5之间的平均值,即97.75。我想我的命令只考虑了第一个最近的日期。请允许我听听您的建议,在第一行获得正确FPG值的期望输出,如下所示

 HN       dob        dateadm     labdate      FPG
001   1999-05-25   2000-11-10   2000-11-11    97.75
002   1979-08-12   2012-07-11   2012-07-13   120.0
001   1999-05-25   2014-04-02   2014-04-02    99.0
002   1979-08-12   2016-03-05   2016-03-05   125.0

Tags: toformatdataframedatetimebylab实验室平均值
1条回答
网友
1楼 · 发布于 2024-06-11 16:29:15

最后,我找到了问题的解决方案,只需交换左右表,然后按如下方式分组

data = pd.merge_asof(lab, admit, left_on="labdate", right_on="dateadm", by="HN", direction="backward").groupby(["HN", "dob", "dateadm"]).agg({"FPG": "mean"}).reset_index()

因为一个dateadm可以有多个labdate,但是我想要的数据粒度是HN和dateadm。因此,我可以忽略所需输出中的labdate

相关问题 更多 >