基于Python中的相邻行计算值

基于Python中的相邻行计算值,python,pandas,dataframe,Python,Pandas,Dataframe,我有成对的数据框形式的值(见“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

我有成对的数据框形式的值(见“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
现在,我想用相同的列创建一个新的数据帧,但要计算相邻的第0行和第1行序列的平均值;2和3;4和5等

预期产出:

    cor     est     rms     apr     mjd
0   0.05539 80.3754 0.01640 80.32   57754.5 
1   0.064   80.339  0.01761 80.275  57755.5
2   -0.0035 80.2014 0.01717 80.2049 57756.5
3   0.08937 79.6243 0.01791 79.5349 57757.5

您可以使用
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

您可以使用
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

与其他答案提供的
GroupBy
解决方案相比,大约快20%,您也可以使用平均值,然后使用以下方法选择每一秒的元素:

注意:此解决方案提供的索引与其他答案不同。 通过一些额外的测试,我发现
rolling
解决方案在大约10K行时更快,之后
GroupBy
更快:

df = pd.DataFrame(np.random.rand(100000, 5))
%timeit df.rolling(2).mean().iloc[1::2].reset_index(drop=True)
%timeit df.groupby(df.index // 2).mean()
#25.5 ms ± 1.05 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
#23.1 ms ± 1.66 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

与其他答案提供的
GroupBy
解决方案相比,大约快20%,您也可以使用平均值,然后使用以下方法选择每一秒的元素:

注意:此解决方案提供的索引与其他答案不同。 通过一些额外的测试,我发现
rolling
解决方案在大约10K行时更快,之后
GroupBy
更快:

df = pd.DataFrame(np.random.rand(100000, 5))
%timeit df.rolling(2).mean().iloc[1::2].reset_index(drop=True)
%timeit df.groupby(df.index // 2).mean()
#25.5 ms ± 1.05 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
#23.1 ms ± 1.66 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
df.rolling(2.mean()[1::2]

解释:

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

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

解释:


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

数字的预期输出是什么?数字的预期输出是什么?小建议,尝试在大数据中测试它(可能是相同的时间,可能不是)我添加了较大数据集的测试结果是的,我同意!对于大约1500行的数据集,滚动方法更快。小建议,尝试在大数据中测试它(可能是相同的计时,可能不是)。我添加了较大数据集的测试结果是的,我同意!对于大约1500行的数据集,滚动方法更快。