我有以下数据帧:
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
,它生成具有最高置信度水平的预测。Ie:对于第1行,conf_2最高,因此most_likely
列的值为"0";猫";。
我试过了:
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
给定这样一个数据帧,其中预测/置信度对彼此相邻,
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)
由于我们避免对行进行迭代,所以它应该相当快。