是否有大熊猫获取连续行之间的平均值?

时间:2018-03-05 17:09:42

标签: python pandas

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(30,3))
df.head()

给出:

       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

假设我想添加另一列将构建第2列中的平均值:在index(0,1)(1,2)...(28,29)之间。

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

所以我想知道是否有一个熊猫的方式:

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()

给出:

       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

如你所见,0.31的平均值为0.21和0.42。

谢谢!

2 个答案:

答案 0 :(得分:4)

我认为您可以使用pandas.DataFrame.rolling执行此操作。以数据框头为例:

df['averages'] = df[2].rolling(2).mean().shift(-1)

返回:

>>> 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

最后的NaN是因为没有索引4的行;但是在你的完整数据框中,它会持续到第二行到最后一行(索引28和29的值的平均值,即你的第29和第30个值)。我只是想表明它给出了与你想要的输出相同的值,所以我使用了你提供的确切数据。 (为了将来参考,如果你想从随机数为我们提供可重现的数据帧,在创建df之前使用并向我们展示一个随机种子,例如np.random.seed(42),那样,我们都将拥有相同的种子。 )

将其分解:

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

答案 1 :(得分:1)

这是一种方式,虽然有点循环。但@sacul's solution更好。我把它留在这里仅供参考。

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