从特定的indexID选择更大的概率

时间:2018-09-18 07:40:28

标签: python database python-2.7

我有一个如下数据库:

     indexID  matchID  order userClean  Probability
0          0        1      0     clean          35
1          0        2      1     clean          75
2          0        2      2     clean          25
5          3        4      5     clean          40
6          3        5      6     clean          85
9          4        5      9     clean          74
12         6        7     12     clean          23
13         6        8     13     clean          72
14         7        8     14     clean          85
15         9       10     15     clean          76
16        10       11     16     clean          91
19        13       14     19     clean          27
23        13       17     23     clean          10
28        13       18     28     clean          71
32        20       21     32     clean          97
33        20       22     33     clean          30

我想要做的是,对于每个重复的indexID,我想选择具有较高概率的条目,并将其标记为“干净”,将另一个标记为“脏”。

输出应如下所示:

     indexID  matchID  order userClean  Probability
0          0        1      0     dirty          35
1          0        2      1     clean          75
2          0        2      2     dirty          25
5          3        4      5     dirty          40
6          3        5      6     clean          85
9          4        5      9     clean          74
12         6        7     12     dirty          23
13         6        8     13     clean          72
14         7        8     14     clean          85
15         9       10     15     clean          76
16        10       11     16     clean          91
19        13       14     19     dirty          27
23        13       17     23     dirty          10
28        13       18     28     clean          71
32        20       21     32     clean          97
33        20       22     33     dirty          30

1 个答案:

答案 0 :(得分:2)

如果需要pandas解决方案,可将Series.neProbability)的!=列与{{3}创建的每个组的max值进行比较,以创建布尔掩码},因为需要Series的大小与df相同:

mask = df['Probability'].ne(df.groupby('indexID')['Probability'].transform('max'))
df.loc[mask, 'userClean'] = 'dirty'
print (df)
    indexID  matchID  order userClean  Probability
0         0        1      0     dirty           35
1         0        2      1     clean           75
2         0        2      2     dirty           25
5         3        4      5     dirty           40
6         3        5      6     clean           85
9         4        5      9     clean           74
12        6        7     12     dirty           23
13        6        8     13     clean           72
14        7        8     14     clean           85
15        9       10     15     clean           76
16       10       11     16     clean           91
19       13       14     19     dirty           27
23       13       17     23     dirty           10
28       13       18     28     clean           71
32       20       21     32     clean           97
33       20       22     33     dirty           30

详细信息

print (df.groupby('indexID')['Probability'].transform('max'))
0     75
1     75
2     75
5     85
6     85
9     74
12    72
13    72
14    85
15    76
16    91
19    71
23    71
28    71
32    97
33    97
Name: Probability, dtype: int64

如果要比较meantransform (>)

mask = df['Probability'].gt(df['Probability'].mean())
df.loc[mask, 'userClean'] = 'dirty'
print (df)
    indexID  matchID  order userClean  Probability
0         0        1      0     clean           35
1         0        2      1     dirty           75
2         0        2      2     clean           25
5         3        4      5     clean           40
6         3        5      6     dirty           85
9         4        5      9     dirty           74
12        6        7     12     clean           23
13        6        8     13     dirty           72
14        7        8     14     dirty           85
15        9       10     15     dirty           76
16       10       11     16     dirty           91
19       13       14     19     clean           27
23       13       17     23     clean           10
28       13       18     28     dirty           71
32       20       21     32     dirty           97
33       20       22     33     clean           30