Скользящее среднее по нескольким столбцам и строкам - PullRequest
0 голосов
/ 08 мая 2018
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 равнялось среднему значению блока ячеек из строк 6–8 в столбцах от A до C. Я хочу сделать это для всех строк.

Я не уверен, как сделать это в одном питоническом действии. Вместо этого у меня есть хакерские временные колонки и безобразная ерунда.

Есть ли более чистый способ определения этого столбца без временных таблиц?

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Вы можете сделать это так:

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
0 голосов
/ 08 мая 2018

Вы можете сделать это так:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...