我正在使用df
和以下代码对数据帧pandas
中的某些值进行重新采样:
>> df['hour'] = f.Date.dt.hour
>> df = df.set_index('Date').resample('60T').mean().reset_index()
我正确地得到了每小时采样60分钟的平均值,如下所示:
>> print(df)
date id mean hour
0 2017-02-09 14:00:00 12345.0 10.000000 14.0
1 2017-02-09 15:00:00 12345.0 10.166667 15.0
2 2017-02-09 16:00:00 12345.0 10.000000 16.0
3 2017-02-09 17:00:00 12345.0 11.000000 17.0
4 2017-02-09 18:00:00 12345.0 9.583333 18.0
5 2017-02-09 19:00:00 12345.0 11.333333 19.0
如果我在相同的数据帧上执行相同的代码(在上述重新采样之前),则对于方差,结果为:
>> df = df.set_index('Date').resample('60T').var().reset_index()
>> print(df)
date id var hour
0 2017-02-09 14:00:00 0.0 92.800000 0.0
1 2017-02-09 15:00:00 0.0 14.166667 0.0
2 2017-02-09 16:00:00 0.0 9.719697 0.0
3 2017-02-09 17:00:00 0.0 19.606061 0.0
4 2017-02-09 18:00:00 0.0 4.090909 0.0
5 2017-02-09 19:00:00 0.0 9.333333 0.0
你知道为什么吗?
编辑: 使用.agg,我可以正确执行均值和中值,但是方差保持剩余的nan。为什么?这是代码:
df = dataset.groupby(['ID',
pd.Grouper(key='Date', freq='60T')])['Value'].agg(['mean', 'median',
'var']).reset_index()
这就是结果
, ID,Date,mean,median,var
0,13834,2017-02-09 12:00:00,1.4749195494770717,1.4749195494770717,
1,13834,2017-02-09 16:00:00,4.424796460176991,4.424796460176991,
2,13834,2017-02-09 20:00:00,2.2418710493046774,2.2418710493046774,
3,13834,2017-02-10 00:00:00,2.6548672566371687,2.6548672566371687,
4,13834,2017-02-10 04:00:00,2.6548672566371683,2.6548672566371683,
5,13834,2017-02-10 08:00:00,0.5110619469026555,0.5110619469026555,
如您所见,输出中甚至不包含方差。怎么样? 谢谢
答案 0 :(得分:0)
GroupBy.mean
和GroupBy.var
会将这些计算应用于所有数字列。
在这种情况下,您定义了一个数字'hour'
列,该列与组中的值相同。对于mean
,出于保险起见,这将返回单个唯一值mean([14, 14, 14, 14]) = 14
。但是用var; var([14, 14, 14, 14]) = 0
,这就是为什么每组中的小时为0并进行方差重采样的原因。
您可能应该提供一个汇总字典,以确保对每一列使用正确的功能:agg({'hour': 'first', ...})