Pandas groupby和roll返回不同的结果

时间:2018-03-27 12:42:27

标签: python pandas dataframe pandas-groupby

我不确定之前是否曾经问过,至少我当时无法找到它。

我有以下数据框:

df = pd.DataFrame(np.random.randn(50,2),columns=list('AB'),index=pd.date_range('20180101 9:01:00',freq='s',periods=50))

我想将此数据帧分组为每组5秒,并计算这些组的平均值。

这可以通过groupby:

完成
df1 = df.groupby(pd.Grouper(freq='5s')).mean() 

或者使用滚动,计算平均值,然后从中获取每个第5个值:

df2 = df.rolling(5).mean()[::5]

然而,这并没有返回相同的结果:

df1 == df2
Out[439]: 
                         A      B
2018-01-01 09:01:00  False  False
2018-01-01 09:01:05  False  False
2018-01-01 09:01:10  False  False
2018-01-01 09:01:15  False  False
2018-01-01 09:01:20  False  False
2018-01-01 09:01:25  False  False
2018-01-01 09:01:30  False  False
2018-01-01 09:01:35  False  False
2018-01-01 09:01:40  False  False
2018-01-01 09:01:45  False  False

为什么这不会返回相同的结果?我如何改变滚动平均值,使其等于groupby方法?我已经尝试了关闭'的不同参数,但这没有帮助。

1 个答案:

答案 0 :(得分:2)

两个数据帧中的索引对齐方式不同。并且,您对df2的索引已关闭。

df1 = df.groupby(pd.Grouper(freq='5s')).mean() 
print(df1.head())

                            A         B
2018-01-01 09:01:00  0.354461  0.272654
2018-01-01 09:01:05 -0.191869  0.106352
2018-01-01 09:01:10 -0.519830  0.194780
2018-01-01 09:01:15  0.360278  0.753964
2018-01-01 09:01:20 -0.085151 -1.266094

df2 = (df.rolling(5).mean())[4::5]
print(df2.head())

                            A         B
2018-01-01 09:01:04  0.354461  0.272654
2018-01-01 09:01:09 -0.191869  0.106352
2018-01-01 09:01:14 -0.519830  0.194780
2018-01-01 09:01:19  0.360278  0.753964
2018-01-01 09:01:24 -0.085151 -1.266094

现在,为了比较,因为pandas主要使用索引进行内部数据对齐的所有操作,我们将这些数据帧转换为numpy数组并进行比较。而且,因为我们正在处理花车,所以让我们使用np.isclose

np.isclose(df1.head().values,df2.head().values)

array([[ True,  True],
       [ True,  True],
       [ True,  True],
       [ True,  True],
       [ True,  True]], dtype=bool)