gpt4 book ai didi

python - 具有 Grouper 速度的 Pandas groupby

转载 作者:太空宇宙 更新时间:2023-11-04 09:48:27 24 4
gpt4 key购买 nike

我正在尝试获取每家医院每天的平均记录数

|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 来解决这个问题因为我喜欢不必“截断”我的日期以供以后分析,也不必创建额外的列来避免这种情况。令我惊讶的是,Grouper 花费了将近 2 倍的时间。

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

Hospital A 7.333333
Hospital B 9.500000

100 次循环,3 次最佳:对于第一种方式,每次循环 5.37 毫秒,对于 Grouper,100 次循环,3 次最佳:每次循环 10.7 毫秒

我在这里正确使用了 Grouper 吗?可能需要很长时间,因为 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

在我的机器上似乎稍微快一些,虽然我不知道大型数据集是否仍然如此。

关于python - 具有 Grouper 速度的 Pandas groupby,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48891436/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com