根据Python Pandas中的相邻行计算值

2021-12-08 06:25:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有熊猫数据帧形式的成对值(见“mjd”列):

    cor      est        rms     apr         mjd
0   0.12359  80.53359   0.01639 80.41       57754.0
1   -0.01281 80.21719   0.01642 80.23       57755.0
2   0.03876  80.26876   0.01743 80.23       57755.0
3   0.08924  80.40924   0.01779 80.32       57756.0
4   0.06863  80.38863   0.01686 80.32       57756.0
5   -0.07582 80.01417   0.01748 80.08999    57757.0
6   0.13964  80.22963   0.01773 80.08999    57757.0
7   0.03911  79.01908   0.01809 78.97997    57758.0

现在,我想用相同的列创建一个新的dataframe,但是要计算相邻的行序列0和1、2和3、4和5等的平均值

预期产量:

^{pr2}$
3条回答
网友
1楼 ·

df.rolling(2).mean()[1::2]

解释:

rolling(2)将为每两个连续行计算mean()。结果数据帧的第一行将显示Nan,因为之前没有计算平均值的值。下一行将显示原始数据帧的第1行和第2行的平均值。现在,如果要将数据帧减半,请计算非隔行扫描序列(第0行和第1行;第2行和第3行;第4行和第5行等)的平均值,然后使用[1::2]索引器只选择第二行。在

网友
2楼 ·

您可以使用df.index // 2进行分组:

In [11]: df.index // 2
Out[11]: Int64Index([0, 0, 1, 1, 2, 2, 3, 3], dtype='int64')

In [12]: df.groupby(df.index // 2).mean()
Out[12]:
        cor        est       rms        apr      mjd
0  0.055390  80.375390  0.016405  80.320000  57754.5
1  0.064000  80.339000  0.017610  80.275000  57755.5
2 -0.003595  80.201400  0.017170  80.204995  57756.5
3  0.089375  79.624355  0.017910  79.534980  57757.5
网友
3楼 ·

大约比其他答案提供的GroupBy解决方案快20%,您还可以使用^{}平均值,然后使用^{}选择每一个元素:

df.rolling(2).mean().iloc[1::2]
#        cor        est       rms        apr      mjd
#1  0.055390  80.375390  0.016405  80.320000  57754.5
#3  0.064000  80.339000  0.017610  80.275000  57755.5
#5 -0.003595  80.201400  0.017170  80.204995  57756.5
#7  0.089375  79.624355  0.017910  79.534980  57757.5

%timeit df.rolling(2).mean().iloc[1::2]
#1.17 ms ± 74.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit df.groupby(df.index // 2).mean()
#1.47 ms ± 110 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

注意这个解决方案给你一个不同于其他答案的索引。 通过一些额外的测试,我发现rolling解决方案速度更快,最多可达10K行,之后{}更快:

^{pr2}$

相关问题