如何基于其他熊猫列和关联字符串列的最大值创建一个新的熊猫列?

时间:2020-08-06 14:45:42

标签: python pandas

我有以下数据框:

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

1 个答案:

答案 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)

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