python-计算 pandas 中 panel data set 中的并发实体数

在过去的几年中,我有一组病人看医生的数据.变量包括患者编号和访问日期.我有兴趣在任何一天确定仍有多少患者正在接受治疗.我认为患者最后一次拜访表明他们不再接受治疗.

患者的访视次数和访视日期不同.这也意味着患者有不同的治疗时间.以下是我的数据示例:

index  patient_id   visit_date
0      01           2014-08-10
1      01           2014-08-12
2      01           2014-08-13
3      02           2014-08-12
4      02           2014-08-15
5      03           2014-08-13
6      03           2014-08-15
7      03           2014-08-16

理想情况下,我希望最终数据集如下所示:

date         num_patients
2014-08-10   1
2014-08-11   1
2014-08-12   2
2014-08-13   3
2014-08-14   2
2014-08-15   2
2014-08-16   1

我正在使用 pandas ,但尝试使用reindex解决此问题未成功.如果使用Stata,则将使用xtset和tsfill,但我不知道它们在 pandas 中的等效性.我将注意到,我的数据集在数千天内的观测值超过300,000,因此,感谢您提供高效的解决方案.

我一直在努力寻找解决问题的最佳方法,因此一直在努力工作,我将不胜感激!

编辑3/19/16

我意识到我对最终输出可能不太清楚.我试图计算出一天中有多少患者正在接受治疗,即使他们当天没有预约.

例如,(请参见上面的输出表)我希望2014-08-13年的患者人数为3,因为患者1、2和3仍在接受治疗.患者1和3在当天进行了实际访问,而患者2没有.但是,患者2仍在计数,因为她尚未记录自己的最终访视时间(2014年8月15日),这表明她仍在接受治疗.

感谢您的所有帮助和建议!

最佳答案

这是获得所需输出的一种方法,但是我不确定在非常大/稀疏的数据集上它的效率如何.

import pandas as pd
from StringIO import StringIO
from pandas.tseries.offsets import DateOffset

str = '''patient_id   visit_date
01           2014-08-10
01           2014-08-12
01           2014-08-13
02           2014-08-12
02           2014-08-15
03           2014-08-13
03           2014-08-15
03           2014-08-16
'''
df = pd.read_csv(StringIO(str), delim_whitespace=True)

df['visit_date'] = pd.to_datetime(df['visit_date'], format='%Y-%m-%d')
df = df.set_index('visit_date', drop=True)

# function to fill in the gaps for each patient
def fill_gaps(group):
    return group.asfreq(DateOffset(days=1))

filled_df = df.groupby('patient_id').apply(fill_gaps)

这是此时的fill_df样子:

                       patient_id
patient_id visit_date            
1          2014-08-10           1
           2014-08-11         NaN
           2014-08-12           1
           2014-08-13           1
2          2014-08-12           2
           2014-08-13         NaN
           2014-08-14         NaN
           2014-08-15           2
3          2014-08-13           3
           2014-08-14         NaN
           2014-08-15           3
           2014-08-16           3

该索引具有我们需要的所有信息,因此我们删除Patient_id列并重置索引.此时,[email protected],并查看数据集中最快的解决方案.

filled_df = filled_df.drop('patient_id', axis=1)
filled_df = filled_df.reset_index()
filled_df = filled_df.set_index('visit_date')

final_df = filled_df.groupby(filled_df.index).size()

现在,final_df看起来像您原始问题的最终数据集:

visit_date
2014-08-10    1
2014-08-11    1
2014-08-12    2
2014-08-13    3
2014-08-14    2
2014-08-15    2
2014-08-16    1