患者的访视次数和访视日期不同.这也意味着患者有不同的治疗时间.以下是我的数据示例:
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