将值保留在Pandas数据框中

时间:2019-03-14 15:54:49

标签: pandas dataframe

请考虑以下熊猫数据框:

_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)的差异。

enter image description here

我尝试了不同的方法,但遇到了麻烦。

我来自SAS编程的背景,这在SAS中非常容易地将值从一行保留到另一行,然后减去。我确定我的想法被SAS污染了(并且标题显然是错误的),但这必须对熊猫来说是可行的。有想法吗?

非常感谢您的帮助。

亲切的问候,

尼古拉斯

2 个答案:

答案 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"]

那不是很漂亮,我知道...