请考虑以下熊猫数据框:
_df = pd.DataFrame([
[4.0, "Diastolic Blood Pressure", 1.0, "2017-01-15", 68],
[4.0, "Diastolic Blood Pressure", 5.0, "2017-04-15", 60],
[4.0, "Diastolic Blood Pressure", 8.0, "2017-06-18", 68],
[4.0, "Heart Rate", 1.0, "2017-01-15", 85],
[4.0, "Heart Rate", 5.0, "2017-04-15", 72],
[4.0, "Heart Rate", 8.0, "2017-06-18", 81],
[6.0, "Diastolic Blood Pressure", 1.0, "2017-01-18", 114],
[6.0, "Diastolic Blood Pressure", 6.0, "2017-02-18", 104],
[6.0, "Diastolic Blood Pressure", 9.0, "2017-03-18", 124]
], columns = ['ID', 'VSname', 'Visit', 'VSdate', 'VSres'])
我想在此df中创建“ Flag”变量:对于每个ID和VSName,请在每次访问时显示与基线(访问1)的差异。
我尝试了不同的方法,但遇到了麻烦。
我来自SAS编程的背景,这在SAS中非常容易地将值从一行保留到另一行,然后减去。我确定我的想法被SAS污染了(并且标题显然是错误的),但这必须对熊猫来说是可行的。有想法吗?
非常感谢您的帮助。
亲切的问候,
尼古拉斯
答案 0 :(得分:0)
假设数据框按ID和访问组(即5、8和紧随1之后)排序,则可以使用cumcount:
c = (df.visit == 1).cumcount()
您可以从每个组的第一个VSRes条目中减去VSRes:
df.VSRes - df.groupby(c).VSRes.transform("first")
答案 1 :(得分:0)
我尝试了给出的答案,但没有成功,出现了我无法解决的错误。不知道为什么...我使用以下方法成功产生了一些东西:
baseline = df[df["Visit"] == 1.0]
baseline = baseline.rename(columns={'VSres': 'baseline'})
df = pd.merge(df, baseline, on = ["ID", "VSname"], how='left')
df["chg"] = df["VSres"] - df["baseline"]
那不是很漂亮,我知道...