Python 基于第三列的列匹配

Python 基于第三列的列匹配,python,pandas,Python,Pandas,我有一个类似于: Name id precision 0 John 1 1 1 John 1 2 2 John 2 3 3 Marc 1 3 4 Tom 2 1 下面是生成它的代码: pd.DataFrame([{'Name': 'John', 'id': 1, 'precision': 1}, {'Name': 'John', 'id': 1, 'preci

我有一个类似于:

    Name  id  precision
0  John   1          1
1  John   1          2
2  John   2          3
3  Marc   1          3
4   Tom   2          1
下面是生成它的代码:

pd.DataFrame([{'Name': 'John', 'id': 1, 'precision': 1}, 
{'Name': 'John', 'id': 1, 'precision': 2}, 
{'Name': 'John','id': 2, 'precision': 3}, 
{'Name': 'Marc', 'id': 1, 'precision': 3}, 
{'Name': 'Tom', 'id': 2, 'precision': 1}])
我有不同的算法可以找到对应的btw名称和id。每个算法在相应的列中都有自己的精度报告(越小越好)。最终我想得到最好的匹配,如果有的话

预期的结果是:

    Name  id  precision
0  John   1          1
4   Tom   2          1
John应该与1匹配,因为它是唯一一个精度为1的匹配项(Marc的精度为3)

Tom应该与2匹配,因为它是唯一一个精度为1的匹配

我正在尝试:

df['min'] = df.groupby('Name').precision.transform(min)

要找到最小值,但我在提取所需结果时遇到困难。

我认为您需要在“id”列而不是名称上分组

df.loc[df.groupby('id')['precision'].idxmin()]
输出:

   Name  id  precision
0  John   1          1
4   Tom   2          1

无需
groupby

df.sort_values(['id','precision']).drop_duplicates(['id'],keep='first')
Out[813]: 
   Name  id  precision
0  John   1          1
4   Tom   2          1

是否删除了
Marc
?你能解释一下原因吗?因为一旦找到对应的btw名称和id是唯一的。在本例中,John获得id 1,因为他具有更好的精度(1)。Marc没有得到id 1,因为算法发现这种匹配可能具有最差的精度(3个),基本上对于一个名称,我只有一个id,对于一个id,我只能有一个名称。为什么不使用布尔索引选择所有等于1的精度,如
df[df['precision'].eq(1)]
nice
idxmin
:-)