解决 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
我正在对数据框执行记录 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