我有如下两个数据帧
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
最后,我找到了问题的解决方案,只需交换左右表,然后按如下方式分组
因为一个dateadm可以有多个labdate,但是我想要的数据粒度是HN和dateadm。因此,我可以忽略所需输出中的labdate
相关问题 更多 >
编程相关推荐