#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}
Прошу прощения, если я совершенно неправильно понял ваш вопрос.