#python #pandas #numpy
Вопрос:
У меня есть следующая матрица в панд:
import numpy as np
import pandas as pd
df_matrix = pd.DataFrame(np.random.random((10, 10)))
Мне нужно получить вектор, содержащий 10 средних значений, по 1 значению на каждой синей линии, как показано на рисунке ниже:
Последнее число в выходном векторе-это в основном 1 число, а не медиана.
Ответ №1:
X = np.random.random((10, 10))
fX = np.fliplr(X) # to get the "other" diagonal
np.array([np.median(np.diag(fX, k=-k)) for k in range(X.shape[0])])
Комментарии:
1. Привет, согласен с @Quang Hoang. Я пришел к тому же решению, используя
np.rot90
вместоnp.fliplr
Ответ №2:
Диагонали таковы, что row_num col_num = constant
. Таким образом, вы можете использовать stack
и суммировать строки/столбцы и groupby
:
(df_matrix.stack().reset_index(name='val')
.assign(diag=lambda x: x.level_0 x.level_1) # enumerate the diagonals
.groupby('diag')['val'].median() # median by diagonal
.loc[len(df_matrix):] # lower triangle diagonals
)
Выход (для np.random.seed(42)
):
diag
9 0.473090
10 0.330898
11 0.531382
12 0.440152
13 0.548075
14 0.325330
15 0.580145
16 0.427541
17 0.248817
18 0.107891
Name: val, dtype: float64
Комментарии:
1. Спасибо, в моей реальной матрице я получаю эту ошибку в строке
.assign(diag=lambda x: x.level_0 x.level_1)
: «Ошибка типа: неподдерживаемые типы операндов для : ‘int’ и ‘str'». Знаете ли вы, почему это может произойти?2. Это связано с тем, что ваши фактические данные имеют строковые имена столбцов. Попробуйте заменить
df_matrx
наpd.DataFrame(df_matrix.to_numpy())
.