Как получить среднее значение из n верхних и n нижних значений для каждого значения в столбце фрейма данных

#python #pandas #dataframe #average

#python #панды #фрейм данных #среднее #pandas

Вопрос:

самым простым способом объяснить это должен быть пример.

Представьте следующий фрейм данных:

 a  b 
1  5   
2  4
3  2
4  2
5  4
6  3
7  2
8  1
9  0
  

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

 a  b   c
1  5   
2  4   
3  2
4  2  3.3
5  4  2.3
6  3  1.83
7  2  
8  1
9  0
  

любая помощь приветствуется

Спасибо

Комментарии:

1. Я действительно не понимаю, какие значения вы усредняете? какой top 3 и какой bot 3? Как вы получаете 3.3 , 2.3 и 1.83 ?

Ответ №1:

Вот мое решение, использующее некоторую справку от numpy:
(df — ваш пример фрейма данных)

 length = df.shape[0]   # Number of rows in the dataframe
windowSize = 3         # Since we are looking at top 3 and bottom 3 values 

for i in range(windowSize, length-windowSize):                   
    # Get the indexes (0-based) of the top 3 values 
    top3Idxs = np.arange(i - windowSize, i)
    bottom3Idxs = np.arange(i   1, i   1   windowSize)
    
    # Get the values in column b at the proper indices
    top3Vals = df.b.to_numpy()[top3Idxs]
    bottom3Vals = df.b.to_numpy()[bottom3Idxs]
    
    # Find the average of the top3Vals and bottom3Vals
    avg = np.mean(np.concatenate((top3Vals, bottom3Vals)))
    
    # Set the average at the proper index in column c
    df.at[i, 'c'] = avg
  

Ответ №2:

Я не совсем понимаю ваш вопрос или как вы получили значения в столбце ‘c’. Если вам нужны верхние и нижние средние значения для двух столбцов, это будет 4 отдельных значения (тогда как у вас есть только 3 значения в столбце ‘c’). Я также не уверен, что под верхним / нижним вы подразумеваете 3 наивысших / наименьших значения в каждом столбце (поскольку вы говорите верхние ‘n’ значения, я предполагаю, что нет).

Верхние / нижние средние значения столбцов a и b будут такими:

 data = {'a': list(range(1,10)), 'b': [5, 4, 2, 2, 4, 3, 2, 1, 0]}

    a   b
0   1   5
1   2   4
2   3   2
3   4   2
4   5   4
5   6   3
6   7   2
7   8   1
8   9   0

n = 3

averages = {}
for col in df.columns:
    averages[col '_bottom_avg'] = df[col][:n].mean()
    averages[col '_top_avg'] = df[col][-n:].mean()

Output:

averages
{'a_bottom_avg': 2.0,
 'a_top_avg': 8.0,
 'b_bottom_avg': 3.6666666666666665,
 'b_top_avg': 1.0}
  

Если вам нужно среднее значение из 3 верхних максимальных / минимальных значений, вы можете просто сначала отсортировать столбцы:

 averages = {}
for col in df.columns:
    averages[col '_bottom_avg'] = df[col].sort_values()[:n].mean()
    averages[col '_top_avg'] = df[col].sort_values()[-n:].mean()

Output:

averages
{'a_bottom_avg': 2.0,
 'a_top_avg': 8.0,
 'b_bottom_avg': 1.0,
 'b_top_avg': 4.333333333333333}
  

Прошу прощения, если я совершенно неправильно понял ваш вопрос.