Сохранять значения в фрейме данных Pandas - PullRequest
0 голосов
/ 14 марта 2019

Рассмотрим следующий кадр данных Pandas:

_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: для каждого идентификатора и VSName показывать разницу от базовой линии (посещение 1) при каждом посещении.

enter image description here

Я пробовал разные подходы и застрял.

Я пришел из опыта программирования на SAS, и в SAS было бы очень легко сохранять значения из строки в другую, а затем вычитать. Я уверен, что мой разум создан SAS (и название явно неправильное), но это должно быть выполнимо с Пандами, так или иначе. Есть идеи?

Большое спасибо за вашу помощь.

С уважением,

Nicolas

Ответы [ 2 ]

0 голосов
/ 15 марта 2019

Я попытался ответить любезно, ни один не сработал, получил ошибки, которые не смог исправить. Не знаю почему ... Мне удалось создать что-то близкое, используя следующее:

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

Это не очень красиво, я знаю ...

0 голосов
/ 14 марта 2019

Предполагая, что DataFrame упорядочен по id и группе посещений (т. Е. 5, 8 и сразу после 1), вы можете использовать cumcount:

c = (df.visit == 1).cumcount()

Вы можете вычесть VSR из первой записи VSRes каждой группы:

df.VSRes - df.groupby(c).VSRes.transform("first")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...