В Excel, когда я хочу суммировать значения по таблице, я могу выполнить суммирование, если условие исключено на основе имени переменной. Есть ли у Pandas аналогичная функция?
Чтобы дать больше контекста, я смотрю на матрицу путаницы и определяю процент правильных и неправильных классификаций.
Пример Excel:
Fantasy Horror RPG
Fantasy 25 3 1
Horror 1 13 0
RPG 11 1 7
==(sum(B2:B4) - SUMIF($A2:$A4,"<>"&B$1,B2:B4))/sum(B2:B4)
Полученные результаты:
0.68 0.76 0.88
Я знаю о функции groupby
, но, насколько я понимаю, она группируется на основе категориальных переменных, а не путем исключения, как это можно сделать с sumif
.
Пример:
import pandas as pd
my_data: pd.DataFrame = pd.read_excel("c:/mydata.xlsx")
mydata.groupby("genre").count()
Пример кода
import pandas as pd
idx = ['Fantasy', 'Horror', 'RPG']
df = pd.DataFrame([[25, 3, 1], [ 1, 13, 0], [11, 1, 7]], index=idx, columns=idx)
дф:
Fantasy Horror RPG
Fantasy 25 3 1
Horror 1 13 0
RPG 11 1 7
Код
tmp = df.unstack()
cond = tmp.index.get_level_values(0) == tmp.index.get_level_values(1)
out = tmp[cond].droplevel(1).div(tmp.groupby(level=0).sum())
вне
Fantasy 0.675676
Horror 0.764706
RPG 0.875000
dtype: float64
Если значения представляют собой квадратную матрицу, поскольку индекс и столбцы имеют одинаковый порядок и одинаковый размер, используйте следующий код
df1 = df.copy()
np.fill_diagonal(df1.values, 0)
out = df1.sum().div(df.sum()).rsub(1)
тот же результат, но быстрее
Не предоставляйте формулы Excel (например:
sum(B2:B4)
), лучше объяснить свою логику в тексте (например:25+1+11
). Кроме того, четко предоставьте желаемый результат.