我正在尝试获取每家医院每天的平均Number of Records

|Hospital|Date|Number of Records
0|Hospital B|2018-02-12 16:07:54.183|5
1|Hospital B|2018-02-12 16:07:54.200|5
2|Hospital B|2018-02-12 16:07:54.220|2
3|Hospital B|2018-02-12 16:07:54.240|2
4|Hospital B|2018-02-12 16:07:54.253|1
5|Hospital B|2018-02-19 14:04:03.927|4
6|Hospital A|2017-12-18 00:00:00|9
7|Hospital A|2017-12-26 00:00:00|6
8|Hospital A|2018-02-05 14:12:49.587000|7

#df1 = pd.read_clipboard(sep='|')


对于df1.groupby(['Hospital','Date']).sum().reset_index().groupby('Hospital').mean(),这很简单,但这是不正确的,因为时间戳使医院A的计算混乱。答案应为9.5。

我可以通过缩短日期来解决此问题。

df1['Date'] = pd.to_datetime(df1['Date'])
df1['Date'] = df1['Date'].dt.date
df1.groupby(['Hospital', 'Date']).sum().reset_index().groupby('Hospital').mean()

Hospital A  7.333333
Hospital B  9.500000


我还尝试使用Grouper解决此问题,因为我不想不必“截断”我的日期以进行以后的分析,也不必创建额外的列来避免这种情况。令我惊讶的是,石斑鱼花了几乎两倍的时间。

df1.set_index('Date').groupby([pd.Grouper(freq='D'),'Hospital']).sum().\
                                dropna().groupby('Hospital').mean()

Hospital A  7.333333
Hospital B  9.500000


100 loops, best of 3: 5.37 ms per loop是第一种方法,100 loops, best of 3: 10.7 ms per loop是石斑鱼。

我在这里正确使用了石斑鱼吗?可能是由于Grouper在我用drop_na()删除的索引中的日期之间创建了几天而花费了很长时间?

最佳答案

您也可以只使用日期值,而不会覆盖您拥有的数据:

day = pd.to_datetime(df1['Date']).dt.date
df1.groupby(['Hospital', day]).sum().reset_index().groupby('Hospital').mean()

Hospital A  7.333333
Hospital B  9.500000


我想您所提到的是Grouper的性能问题,生成大量行只是为了稍后将其丢弃。但是,使用to_datetime解析日期会对性能产生必要的影响。您可以尝试避免解析,而只是将字符串切成薄片:

day = df1['Date'].str.slice(0, 10)
df1.groupby(['Hospital', day]).sum().reset_index().groupby('Hospital').mean()

Hospital A  7.333333
Hospital B  9.500000


尽管我不知道大型数据集是否仍然会在我的计算机中看起来更快一些。

10-07 21:54