如何创建按日期排序的groupby ID变量的第一次出现的指示列?



在表单的数据框架中有一些医院访问医疗保健数据:

COUNSELLING_COUNT0002018-04-3032015-09-0100

更新

在我最初的答案中,我忽略了一个事实,即如果某人没有咨询日期,我的方法将为他们的第一个条目分配一个1。这里有两个快速的方法来解决这个问题。

一个选项是在执行groupby i describe:

之前显式地删除那些带有NA的行。
dropped = df[~df['DATE_COUNSELLING'].isna()]
df.loc[:, 'COUNSELLING_STARTED'] = 0
df.loc[dropped['DATE_COUNSELLING'].isna().groupby(dropped['CLIENT_ID']).idxmin(), 'COUNSELLING_STARTED'] = 1
# note that `dropped` is used inside the brackets in the last line

第二种选择是简单地按照我之前的方法做,但然后覆盖错误的条目(即,咨询是NA):

df.loc[:, 'COUNSELLING_STARTED'] = 0
df.loc[df['DATE_COUNSELLING'].isna().groupby(df['CLIENT_ID']).idxmin(), 'COUNSELLING_STARTED'] = 1
df.loc[df['DATE_COUNSELLING'].isna(), 'COUNSELLING_STARTED'] = 0
# last line catches people with no counseling

这是我最初的回答:

df.loc[:, 'COUNSELLING_STARTED'] = 0
df.loc[df['DATE_COUNSELLING'].isna().groupby(df['CLIENT_ID']).idxmin(), 'COUNSELLING_STARTED'] = 1

解释(使用我的第一种方法):

查找咨询日期为nan的地方;然后按客户端id分组并找到最小值的索引(这将是第一个条目):

>>> dropped['DATE_COUNSELLING'].isna().groupby(dropped['CLIENT_ID']).idxmin()
CLIENT_ID
54950    3
67777    7
70000    8
Name: DATE_COUNSELLING, dtype: int64

您使用这些索引来选择在新列中写入1的位置。即使dropped没有任何NA值,我们仍然在groupby中使用.isna(),以便获得我们可以使用min的值(而不是字符串)。你也可以像.astype(bool).

最后的df是:

CLIENT_ID DATE_ENCOUNTER  ... COUNSELLING_COUNT  COUNSELLING_STARTED
0      54950     2017-11-24  ...                 0                    0
1      54950     2018-01-19  ...                 0                    0
2      54950     2018-03-13  ...                 0                    0
3      54950     2018-05-11  ...                 1                    1
4      54950     2018-12-17  ...                 3                    0
5      67777     2015-09-01  ...                 0                    0
6      67777     2015-12-01  ...                 0                    0
7      67777     2016-02-28  ...                 1                    1
8      70000     2019-06-07  ...                 1                    1
9      70000     2019-08-09  ...                 1                    0
[10 rows x 5 columns]

如果你想明确选择最早的咨询日期(而不是第一个非na值),你可以使用这个作为你的索引器:

>>> pd.to_datetime(dropped['DATE_COUNSELLING']).groupby(dropped['CLIENT_ID']).idxmin()
CLIENT_ID
54950    3
67777    7
70000    8
Name: DATE_COUNSELLING, dtype: int64

这在这里给出了相同的结果,因为日期是为每个客户端排序的(即最早观察到的日期是第一个非na值)。

相关内容

最新更新