多个列和行的滚动平均值

时间:2018-05-08 09:34:35

标签: python pandas

import random
random.sample(range(1, 100), 10)
df = pd.DataFrame({"A": random.sample(range(1, 100), 10), 
                   "B":random.sample(range(1, 100), 10),
                  "C":random.sample(range(1, 100), 10)})
df["D"]="need_to_calc"
df

enter image description here

我需要列D,第9行的值等于A到C列中第6到第8行的单元格块的平均值。我想对所有行执行此操作。

我不确定如何在单个pythonic动作中执行此操作。相反,我有hacky临时列和丑陋的废话。

有没有更简洁的方法来定义没有临时表的列?

2 个答案:

答案 0 :(得分:0)

你可以这样做:

means = df.rolling(3).mean().shift(1)
df['D'] = (means['A'] + means['B'] + means['C'])/3

输出:

    A   B   C          D
0  43  57  15        NaN
1  86  34  68        NaN
2  40  12  78        NaN
3  97  24  54  48.111111
4  90  42  10  54.777778
5  34  54  98  49.666667
6  98  36  31  55.888889
7  16   5  24  54.777778
8  35  53  67  44.000000
9  80  66  37  40.555556

答案 1 :(得分:0)

你可以这样做:

df["D"]= (df.sum(axis=1).rolling(window=3, min_periods=3).sum()/9).shift(1)

示例:

    A   B   C             D
0  62  89  12  need_to_calc
1  44  13  63  need_to_calc
2  28  21  54  need_to_calc
3  93  93   4  need_to_calc
4  95  84  42  need_to_calc
5  68  68  35  need_to_calc
6   3  92  56  need_to_calc
7  13  88  83  need_to_calc
8  22  37  23  need_to_calc
9  64  58   5  need_to_calc

输出:

    A   B   C          D
0  62  89  12        NaN
1  44  13  63        NaN
2  28  21  54        NaN
3  93  93   4  42.888889
4  95  84  42  45.888889
5  68  68  35  57.111111
6   3  92  56  64.666667
7  13  88  83  60.333333
8  22  37  23  56.222222
9  64  58   5  46.333333