Python 有没有办法得到连续行之间的平均值?

Python 有没有办法得到连续行之间的平均值?,python,pandas,Python,Pandas,其中: import pandas as pd import numpy as np df = pd.DataFrame(np.random.rand(30,3)) df.head() averages = [] for index, item in enumerate(df[2]): if index < df[2].shape[0] -1: averages.append((item + df[2].iloc[index + 1]) / 2) df["aver

其中:

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(30,3))
df.head()
averages = []
for index, item in enumerate(df[2]):
    if index < df[2].shape[0] -1:
        averages.append((item + df[2].iloc[index + 1]) / 2)
df["averages"] = pd.Series(averages)
df.head()
假设我想添加另一列来构建第2列中的平均值:在索引(0,1)(1,2)之间。。。(28,29)

我认为这是一项常见的任务,因为第2列是x轴位置,我希望绘图上的分类标签显示在x轴上两个点之间的中间

所以我想知道是否有一种方法:

       0            1           2
0   0.741955    0.913681    0.110109
1   0.079039    0.662438    0.510414
2   0.469055    0.201658    0.259958
3   0.371357    0.018394    0.485339
4   0.850254    0.808264    0.469885
如你所见,0.31是0.21和0.42的平均值


谢谢

我认为您可以使用
pandas.DataFrame.rolling
实现这一点。以您的数据帧头为例:

       0           1           2        averages
0   0.997044    0.965708    0.211980    0.318781
1   0.716349    0.724811    0.425583    0.378653
2   0.729991    0.985072    0.331723    0.333138
3   0.996487    0.272300    0.334554    0.586686
返回:

df['averages'] = df[2].rolling(2).mean().shift(-1)
末尾的
NaN
存在,因为没有行索引4;但在完整的数据帧中,它将一直持续到倒数第二行(索引28和29的平均值,即第29和第30个值)。我只是想说明这与您期望的输出值相同,所以我使用了您提供的确切数据。(为了将来的参考,如果您想从随机数中为我们提供一个可复制的数据帧,请在创建df之前使用并向我们显示一个随机种子,例如
np.random.seed(42)
,这样,我们都将拥有相同的种子。)

分解它:


df[2]
是因为您对第2列感兴趣
.rolling(2)
之所以存在,是因为您想要得到2个值的平均值(如果您想要3个值的平均值,请使用
.rolling(3)
等…),
.mean()
是您想要的任何函数(在您的情况下,是平均值);最后,
.shift(-1)
确保新列位于正确的位置(即,确保在第2列中显示每个值的平均值和下面的值,因为默认值是上面的值)

这是一种方法,尽管有点循环。但这更好。我把这个留在这里仅供参考

>>> df
          0         1         2  averages
0  0.997044  0.965708  0.211980  0.318781
1  0.716349  0.724811  0.425583  0.378653
2  0.729991  0.985072  0.331723  0.333139
3  0.996487  0.272300  0.334554       NaN
import pandas as pd
import numpy as np
from itertools import zip_longest

df = pd.DataFrame(np.random.rand(30, 3))
v = df.values[:, -1]

df = df.join(pd.DataFrame(np.array([np.mean([i, j], axis=0) for i, j in \
             zip_longest(v, v[1:], fillvalue=v[-1])]), columns=['2_pair_avg']))

#            0         1         2  2_pair_avg
# 0   0.382656  0.228837  0.053199    0.373678
# 1   0.812690  0.255277  0.694156    0.697738
# 2   0.040521  0.211511  0.701320    0.491044
# 3   0.558739  0.697916  0.280768    0.615398
# 4   0.262771  0.912669  0.950029    0.489550
# 5   0.217489  0.405125  0.029071    0.101794
# 6   0.577929  0.933565  0.174517    0.214530
# 7   0.067030  0.452027  0.254544    0.613225
# 8   0.580869  0.556112  0.971907    0.582547
# 9   0.483528  0.951537  0.193188    0.175215
# 10  0.481141  0.589833  0.157242    0.159363
# 11  0.087057  0.823691  0.161485    0.108634
# 12  0.319516  0.161386  0.055784    0.285276
# 13  0.901529  0.365992  0.514768    0.386599
# 14  0.270118  0.454583  0.258430    0.245463
# 15  0.379739  0.299569  0.232497    0.214943
# 16  0.017621  0.182647  0.197389    0.538386
# 17  0.720688  0.147093  0.879383    0.732239
# 18  0.859594  0.538390  0.585096    0.503846
# 19  0.360718  0.571567  0.422596    0.287384
# 20  0.874800  0.391535  0.152171    0.239078
# 21  0.935150  0.379871  0.325984    0.294485
# 22  0.269607  0.891331  0.262986    0.212050
# 23  0.140976  0.414547  0.161115    0.542682
# 24  0.851434  0.059209  0.924250    0.801210
# 25  0.389025  0.774885  0.678170    0.388856
# 26  0.679247  0.982517  0.099542    0.372649
# 27  0.670354  0.279138  0.645756    0.336031
# 28  0.393414  0.970737  0.026307    0.343947
# 29  0.479611  0.349401  0.661587    0.661587