解决 Pandas 数据框中的冲突

Resolving conflicts in Pandas dataframe

我正在对数据框执行记录 link年龄,例如:

ID_1     ID_2    Predicted Link     Probability
   1        0                 1             0.9
   1        1                 1             0.5
   1        2                 0               0
   2        1                 1             0.8
   2        5                 1             0.8
   3        1                 0               0
   3        2                 1             0.5

当我的模型预测过高并且 link 相同 ID_1 到多个 ID_2(由预测 Link 中的 1 表示)我想解决基于概率值的冲突。如果一个预测 link 的概率比另一个高,我想为此保留 1,但将 ID_1 的另一个预测 link 值反转为 0。如果(最高)概率具有相等的价值我想将所有预测的 link 值反转为 0。如果只有一个预测 link 那么预测值应该保持原样。

生成的数据框如下所示:

ID_1     ID_2    Predicted Link     Probability
   1        0                 1             0.9
   1        1                 0             0.5
   1        2                 0               0
   2        1                 0             0.8
   2        5                 0             0.8
   3        1                 0               0
   3        2                 1             0.5

我通过 pandas.groupby 进行分组,并尝试使用 numpy.select 和 numpy.where 进行一些变体,但没有成功。非常感谢任何帮助!

对于每个 ID_1,您只想保留一行。因此,分组是一个好的开始。

首先让我们构建我们的数据:

import pandas as pd
from io import StringIO

csvfile = StringIO(
"""ID_1\tID_2\tPredicted Link\tProbability
1\t0\t1\t0.9
1\t1\t1\t0.5
1\t2\t0\t0
2\t1\t1\t0.8
2\t5\t1\t0.8
3\t1\t0\t0
3\t2\t1\t0.5""")

df = pd.read_csv(csvfile, sep = '\t', engine='python')

我们想要为 ID_1 的每个值分组,然后寻找包含 ID_1 的所述值的概率最大值的行。让我们创建一个面具:


max_proba = df.groupby("ID_1")["Probability"].transform(lambda x : x.eq(x.max()))

max_proba
Out[196]: 
0     True
1    False
2    False
3     True
4     True
5    False
6     True
Name: Probability, dtype: bool

考虑到您的规则,第 0、1、2 行和第 5、6 行有效(该 ID_1 值只有一个最大值),但第 3 和 4 行无效。让我们构建一个考虑这两个条件的掩码,True if if max value 和 if only one max value.

更准确地说,对于每个 ID_1,如果概率值重复,则它不能成为所述最大值的候选者。然后我们将建立一个最大值,排除每个 ID_1 值

的重复概率值
mask_unique = df.groupby(["ID_1", "Probability"])["Probability"].transform(lambda x : len(x) == 1)

mask_unique
Out[284]: 
0     True
1     True
2     True
3    False
4    False
5     True
6     True
Name: Probability, dtype: bool

最后,让我们结合我们的两个面具:

df.loc[:, "Predicted Link"] = 1 * (mask_max_proba & mask_unique)

df
Out[285]: 
   ID_1  ID_2  Predicted Link  Probability
0     1     0               1          0.9
1     1     1               0          0.5
2     1     2               0          0.0
3     2     1               0          0.8
4     2     5               0          0.8
5     3     1               0          0.0
6     3     2               1          0.5