我不确定之前是否曾经问过,至少我当时无法找到它。
我有以下数据框:
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方法?我已经尝试了关闭'的不同参数,但这没有帮助。
答案 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)