Панды: Как найти среднее значение столбца - PullRequest
2 голосов
/ 25 июня 2019

Как мы можем эффективно найти среднее значение столбца в кадре данных pandas?

Мне нравится делить столбец на 5 частей и находить среднее значение для каждой части.

Вот чтоЯ сделал:

import numpy as np
import pandas as pd

df = pd.DataFrame({'x': np.arange(20)})
n_bins = 5
dfs = np.array_split(df,n_bins)

x_means = [x.mean()[0] for x in dfs]
n_elems = len(df) // n_bins
x_mean_lst = [[i]*n_elems for i in x_means]
x_mean_array = np.array(x_mean_lst).flatten()
df['x_bin_mean'] = x_mean_array
df

Это кажется более сложным, чем необходимо.Есть ли лучшие альтернативы?

Вывод должен выглядеть следующим образом:

     x  x_bin_mean
0    0         1.5
1    1         1.5
2    2         1.5
3    3         1.5
4    4         5.5
5    5         5.5
6    6         5.5
7    7         5.5
8    8         9.5
9    9         9.5
10  10         9.5
11  11         9.5
12  12        13.5
13  13        13.5
14  14        13.5
15  15        13.5
16  16        17.5
17  17        17.5
18  18        17.5
19  19        17.5

1 Ответ

6 голосов
/ 25 июня 2019

Полагаю, вы хотите что-то вроде

df.groupby(df.index // (len(df) // n_bins))['x'].transform('mean')

или, если ваш индекс не числовой,

df.groupby(pd.RangeIndex(len(df)) // (len(df) // n_bins))['x'].transform('mean')

Вот как будет выглядеть группировщик и вывод для n_bins = 5,

df.index // (len(df) // 5)
# Int64Index([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4], dtype='int64')

df['x_bin_mean'] = (
    df.groupby(df.index // (len(df) // 5))['x'].transform('mean'))
df.head(10)

   x  x_bin_mean
0  0         1.5
1  1         1.5
2  2         1.5
3  3         1.5
4  4         5.5
5  5         5.5
6  6         5.5
7  7         5.5
8  8         9.5
9  9         9.5

Обратите внимание, что целочисленное деление, хотя и быстрое, может не обрабатывать случаи, когда индекс не делится поровну:

Я не уверен, что целочисленное деление является полностью правильным (если что-то не делите равномерно). Например, с длиной 16 и n_bins = 5 Вы получаете 6 групп —Alollz

В этом случае воспользуйтесь полезным предложением Алолца pd.qcut:

df.groupby(pd.qcut(df.index, n_bins))['x'].transform('mean')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...