如何根据其他panda列和关联字符串列的最大值创建新的panda列



我有以下数据帧:

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)

由于我们避免对行进行迭代,所以它应该相当快。

相关内容

  • 没有找到相关文章

最新更新