2017-10-17 109 views
1

我有一个像DF:列匹配基于第三列

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 

约翰应与1匹配,因为它是唯一一个匹配以1:1的精度(马克具有3一精度)。

汤姆应与2匹配,因为它是唯一一个匹配与1

精密的我,试图:

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

要找出最小,但我有在提取的烦恼那么期望的结果。

+0

和'Marc'被删除?你能解释为什么吗? – jezrael

+0

,因为一旦找到通信btw名称和ID是唯一的。在这种情况下,约翰得到id 1,因为他有更好的精度(1)。 Marc没有得到id 1,因为算法发现这种匹配可能具有最差的精确度(3) – user2320577

+0

基本上用于一个名称我只有1个id并且对于1个id我可以只有1个名称 – user2320577

回答

1

我认为你需要在'id'列而不是名字上进行分组。

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

输出:

Name id precision 
0 John 1   1 
4 Tom 2   1 
+0

nice'idxmin' :-) – Wen

+0

@Wen .... .Credit jezreal for that usage。 :) –

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 
相关问题