Как создать переменную после группового - PullRequest
1 голос
/ 19 мая 2019

У меня есть длинный формат данных pandas, который включает несколько записей для некоторых людей.У меня есть переменная, которая указывает одно время измерений после другой отдельной оценки (оценка A).Что я хотел бы сделать, это создать новую переменную, которая идентифицирует момент времени каждой оценки относительно оценки A, и назначить первый момент времени каждого человека (если это <= 10 дней оценки A) в качестве момента времени 1, затемих последующие измерения как 2, 3, 4 и т. д. независимо от времени, прошедшего с момента оценки A. Если у них нет оценки <= 10 дней оценки A, то я бы хотел, чтобы все записи для этого человека были NA. </p>

Я уверен, что ответ касается группового.Я могу группировать код каждого человека, но я довольно застрял в том, как действовать дальше.

Логика, которой я пытался следовать, такова: - groupby ID_Code - для каждого ID_Code проверьтепервая строка 'время с момента оценки A' <= 10 - если истина, первая строка = 1 во временной точке И назначьте следующие строки этого идентификатора ID_Code 2, 3, 4 и т. д. - в противном случае назначьте все строки для этого кода ID_Code как NA </p>

Я могу предоставить больше информации, если неясно.Я совершенно новичок в очистке своих данных с помощью Python, и это мой первый вопрос о стекопереработке, поэтому я открыт для любых советов!

Заранее спасибо.

import pandas as pd

# Current data
df = pd.DataFrame(data={'ID_Code':['AA_01', 'AA_01', 'BB_02', 'CC_03', 'CC_03', 'CC_03', 'CC_03', 'DD_05', 'DD_05'],
                       'Time_since_A':[0, 134, 0, 7, 145, 289, 312, 500, 650]})
print(df)

# Intended output
df2 = pd.DataFrame(data={'ID_Code':['AA_01', 'AA_01', 'BB_02', 'CC_03', 'CC_03', 'CC_03', 'CC_03', 'DD_05', 'DD_05'],
                       'Time_since_A':[0, 134, 0, 7, 145, 289, 312, 500, 650],
                        'Timepoint':[1, 2, 1, 1, 2, 3, 4, 'NA', 'NA']})
print(df2)

1 Ответ

0 голосов
/ 19 мая 2019

Используйте GroupBy.transform с GroupBy.first для серий с таким же размером, как у оригинала, поэтому возможно сравнение, а для отфильтрованных групп используйте GroupBy.cumcount для счетчика по группам:

mask = df.groupby('ID_Code')['Time_since_A'].transform('first') <= 10
df.loc[mask, 'Timepoint'] = df[mask].groupby('ID_Code').cumcount() + 1
print (df)
  ID_Code  Time_since_A  Timepoint
0   AA_01             0        1.0
1   AA_01           134        2.0
2   BB_02             0        1.0
3   CC_03             7        1.0
4   CC_03           145        2.0
5   CC_03           289        3.0
6   CC_03           312        4.0
7   DD_05           500        NaN
8   DD_05           650        NaN

Деталь

print (df.groupby('ID_Code')['Time_since_A'].transform('first'))
0      0
1      0
2      0
3      7
4      7
5      7
6      7
7    500
8    500
Name: Time_since_A, dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...