Python Pandas groupby或滚动多年平均汇总统计数据

时间:2018-02-04 17:43:12

标签: python pandas

我有一个大熊猫时间序列数据框,每年约有20行,从2014年到2017年,我试图计算每两年的平均值。

例如:

  • 01/1/2014至2015年12月31日
  • 01/1/2015至2016/12/12
  • 01/1/2016至2017年12月31日

以下是我用来创建DataFrame的代码:

import pandas as pd

infile = 'https://environment.data.gov.uk/bwq/downloadAPI/requestDownload?report=samples&bw=ukj2100-14950&to=2018-02-05&from=2014-05-01'
df = pd.read_csv(infile,compression='zip',usecols=['intestinalEnterococciCount','sampleTime'], parse_dates=['sampleTime'],infer_datetime_format=True,index_col=['sampleTime'],na_values=True)

以及DataFrame的一个示例:

                     intestinalEnterococciCount
sampleTime                                     
2014-05-12 13:00:00                          10
2014-05-21 12:27:00                          10
2014-05-27 10:55:00                          10
2014-06-06 12:19:00                          10
2014-06-09 13:26:00                          10

我想计算每两年的平均值。预期的答案是:

Period                Mean
Jan 2014 - Dec 2015:  33.575
Jan 2015 - Dec 2016:  22.85
Jan 2016 - Dec 2017:  25.5

我知道我可以使用一个循环遍历两年期间的列表并以这种方式计算它,但我确信必须有一个更好的方法来实现这个使用Pandas。

我尝试使用.rolling,但似乎给出了滚动均值,它逐行递增,而不是超过两年。

我可以成功地使用groupby(df.index.year).mean来获得每年的平均值,但是如何计算每两年的平均值呢?

非常感谢任何帮助。

由于

2 个答案:

答案 0 :(得分:1)

您可以使用groupbyrolling,确保记录计数和总和,以便将来计算均值,(您只需要使用{{1}将索引更改为所需内容})

s.index=[your index list]

更新

s=df.groupby(df.index.strftime('%Y')).intestinalEnterococciCount.agg(['sum','count'])

s=s.rolling(window=2).sum()

s['mean']=s['sum']/s['count']

s.dropna()

Out[564]: 
         sum  count    mean
2015  1343.0   40.0  33.575
2016   914.0   40.0  22.850
2017   765.0   30.0  25.500

答案 1 :(得分:0)

要获得标准偏差和几何平均值等其他汇总统计数据,这里有点像哈希的方式:

df_std = pd.DataFrame([df[str(y):str(y+2)].std() for y in df.index.year.unique()])
df_std.index = df.index.year.unique().sort_values()

df_std
            intestinalEnterococciCount
sampleTime
2014                         63.825528
2015                         37.596271
2016                         34.845224
2017                         51.384066

from scipy.stats.mstats import gmean
df_gm = pd.DataFrame([df[str(y):str(y+2)].agg(gmean) for y in df.index.year.unique()])
df_gm.index = df.index.year.unique().sort_values()

df_gm
            intestinalEnterococciCount
sampleTime
2014                         16.230186
2015                         16.136248
2016                         16.377124
2017                         19.529690