我正在對資料框執行記錄鏈接,例如:
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
當我的模型過度預測并將相同的 ID_1 鏈接到多個 ID_2(在預測鏈接中用 1 表示)時,我想根據概率值解決沖突。如果一個預測鏈接的概率高于另一個我想為此保留 1,但將該 ID_1 的其他預測鏈接值反轉為 0。如果(最高)概率具有相等的值,我想反轉所有預測鏈接值到 0。如果只有一個預測鏈接,則預測值應保持原樣。
生成的資料框如下所示:
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 的一些變體,但沒有運氣。非常感謝任何幫助!
uj5u.com熱心網友回復:
對于每個 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如果最大值和如果只有一個最大值。
更準確地說,對于每個 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/448996.html
下一篇:多維字典到資料框python
