【问题标题】:Is there a pandas way of getting the averages between consecutive rows?有没有一种熊猫方法可以获取连续行之间的平均值?
【发布时间】:2018-08-13 10:16:21
【问题描述】:
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 列中的平均值:在索引 (0,1) (1,2)... (28,29) 之间。

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

所以我想知道是否有熊猫方法:

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 的平均值。

谢谢!

【问题讨论】:

标签: python pandas


【解决方案1】:

我认为您可以使用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 列中每个值的平均值以及 below 值,因为默认值是 以上)

【讨论】:

    【解决方案2】:

    这是一种方法,虽然有点绕圈子。但是@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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-17
      • 1970-01-01
      • 2019-09-22
      • 2021-04-04
      • 1970-01-01
      • 2020-04-23
      • 2023-01-12
      • 2015-09-11
      相关资源
      最近更新 更多