2017-10-17 155 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 
相關問題