我有以下数据框:
id pred_1 conf_1 pred_2 conf_2 pred_3 conf_3
1 dog .5 cat .7 fish .3
2 cat .1 fish .8 dog .4
3 fish .7 pig .3 cat .6
我想创建一个新列most likely
,该列生成具有最高置信度的预测。即:对于第1行,conf_2最高,因此most_likely
列的值为“ cat”。
我尝试过:
def highest_confidence(row):
if max(row.p1_conf, row.p2_conf, row.p3_conf) == row.p1_conf:
row["most_likely"] = row.p1
elif max(row.p1_conf, row.p2_conf, row.p3_conf) == row.p2_conf:
row["most_likely"] = row.p2
else:
row["most_likely"] = row.p3
images.apply(highest_confidence, axis=1)
但出现错误:IndexError: index 13 is out of bounds for axis 0 with size 13
答案 0 :(得分:0)
给出一个这样的数据帧,其中预测/置信对彼此相邻,
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")
最后,我们遍历每一列,进行过滤和连接:
hits = []
for column in shifted.columns:
hits.append(shifted.loc[bool_matrix[column], column])
df["most_likely"] = pd.concat(hits)
由于我们避免对行进行迭代,因此它应该相当快。