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)]
niceidxmin
:-)