首页 > 解决方案 > 如何检查熊猫数据框中是否存在特定条目并添加新条目?

问题描述

我有一个数据框,它由混淆矩阵分组(tp、fp、fn、tn)、模型名称(下面的示例有 2 个模型,但实际上这是一个可变数量且更大)和比例(示例的比例在给定的模型 + 混淆矩阵分组中,例如模型 1 的示例比例为 tp)。数据框看起来像这样,但这又是由组合而成的,而且要小得多。

confusion_matrix_group   |  model   | proportion
TP                          Model1       0.73
TN                          Model1       0.27
FN                          Model2       0.24
TP                          Model2       0.58
TN                          Model2       0.18
...

如您所见,给定模型的 TP+FP+FN+TN 比例总和为 1。但是,如示例中所示,模型可能没有全部 4 个分组(模型 1 仅 TP/TN 和 FN/TP/ TN 模型 2)。我想通过并填写任何缺失的组来获得分组、模型和 0.0 的比例。上面的例子会变成这样:

confusion_matrix_group   |  model   | proportion
TP                          Model1       0.73
TN                          Model1       0.27
FN                          Model2       0.24
TP                          Model2       0.58
TN                          Model2       0.18
FP                          Model1       0.0
FN                          Model1       0.0
FP                          Model2       0.0
...

我尝试应用以下代码,但由于某种原因,它没有进入下面的 if 条件,这对我来说没有意义。我怀疑这是解决此问题的最佳方法,因此可以完全修复此代码或其他建议。谢谢你的帮助!

for group in ['TP', 'TN', 'FP', 'FN']:
    for model in np.unique(df.model):
        print([group, model])
          # To fix: This condition doesn't work
        if [group, model]) not in df[['confusion_matrix_group', 'model']].values:
            # TODO: ADD NEW ROW to df

标签: pythonpandasnumpydataframe

解决方案


一种方法是先粗暴地添加所有组合,然后再添加drop_duplicates(可能对性能不友好):

import pandas as pd

df = pd.DataFrame({'confusion_matrix_group': {0: 'TP', 1: 'TN', 2: 'FN', 3: 'TP', 4: 'TN'},
                   'model': {0: 'Model1', 1: 'Model1', 2: 'Model2', 3: 'Model2', 4: 'Model2'},
                   'proportion': {0: 0.73, 1: 0.27, 2: 0.24, 3: 0.58, 4: 0.18}})

df2 = pd.DataFrame([[x, i, 0] for i in df["model"].unique() for x in ("TP","FP","FN","TN")],columns=df.columns)

print (pd.concat([df,df2],ignore_index=True).drop_duplicates(["model","confusion_matrix_group"],keep="first"))

#
   confusion_matrix_group   model  proportion
0                      TP  Model1        0.73
1                      TN  Model1        0.27
2                      FN  Model2        0.24
3                      TP  Model2        0.58
4                      TN  Model2        0.18
6                      FP  Model1        0.00
7                      FN  Model1        0.00
10                     FP  Model2        0.00

另一种类似的方法是首先创建一个新的串联名称列:

df["new"] = df["confusion_matrix_group"]+df["model"]

df2 = pd.DataFrame([[x, i, 0, x+i] for i in df["model"].unique() for x in ("TP","FP","FN","TN")],columns=df.columns)

print (pd.concat([df,df2.loc[~df2["new"].isin(df["new"])]],ignore_index=True))

#
  confusion_matrix_group   model  proportion       new
0                     TP  Model1        0.73  TPModel1
1                     TN  Model1        0.27  TNModel1
2                     FN  Model2        0.24  FNModel2
3                     TP  Model2        0.58  TPModel2
4                     TN  Model2        0.18  TNModel2
5                     FP  Model1        0.00  FPModel1
6                     FN  Model1        0.00  FNModel1
7                     FP  Model2        0.00  FPModel2

推荐阅读