Учитывая такой фрейм данных, где пары прогноз / достоверность находятся рядом друг с другом,
import pandas as pd
import numpy as np
import random
values = ["dog", "cat", "fish", "pig"]
df = pd.DataFrame(data={
"pred_1": random.sample(values, 4),
"conf_1": np.random.random(4),
"pred_2": random.sample(values, 4),
"conf_2": np.random.random(4),
"pred_3": random.sample(values, 4),
"conf_3": np.random.random(4)
})
Мы можем создать из него временный фрейм данных, который будет просто True
/ False
в зависимости от от того, является ли значение ячейки максимальным значением для строки:
bool_matrix = df.eq(df.max(axis=1), axis="index")
Затем мы можем сдвинуть исходный фрейм данных на один столбец вправо, чтобы соответствовать логическим значениям. Обратите внимание, что по умолчанию сдвиг происходит в следующем столбце того же типа, поэтому мы должны преобразовать числа в строки:
shifted = df.astype(str).shift(periods=1, axis="columns")
И, наконец, мы go по каждому столбцу, фильтруем и объединяем:
hits = []
for column in shifted.columns:
hits.append(shifted.loc[bool_matrix[column], column])
df["most_likely"] = pd.concat(hits)
Так как мы избегаем перебора строк, это должно быть достаточно быстро.