2015-09-04 70 views
1

如何從pandas數據框(餘弦相似度矩陣)找到第二個max或max where index!=列?我可以遍歷每個列,並完成指標!=列,但我相信有一個更好的辦法...如何從熊貓數據框(餘弦相似度矩陣)中找到第二個最大值

import pandas as pd 
cos = pd.DataFrame([ 
    [ 1.  , 0.17404038, 0.36849397], 
    [ 0.17404038, 1.  , 0.20505339], 
    [ 0.36849397, 0.20505339, 1.  ] 
    ]) 
cos.columns = ['A', 'B', 'C'] 
cos.index = ['A', 'B', 'C'] 

COS看起來像這樣

A   B   C 
A 1.000000 0.174040 0.368494 
B 0.174040 1.000000 0.205053 
C 0.368494 0.205053 1.000000 

剔除其中的值是1的細胞,我想要的結果是

Col1 Col2 
0 A  C 
1 B  C 
2 C  A 

我可以這樣做,並獲得第二個max而不是max嗎?

results = cos.idxmax().reset_index() 
results.columns = ['Col1', 'Col2'] 

results 
    Col1 Col2 
0 A  A 
1 B  B 
2 C  C 
+0

爲什麼不把'1'設置爲'-1',然後得到'max'? – EdChum

回答

2

你可以只用任意值替換1,然後調用idxmaxreset_index像以前一樣:

In [140]: 
cos.replace(1,np.NaN).idxmax().reset_index() 

Out[140]: 
    index 0 
0  A C 
1  B C 
2  C A 

所以只是撻它一點:

In [141]: 
new_df = cos.replace(1,np.NaN).idxmax().reset_index() 
new_df.columns=['Col1', 'Col2'] 
new_df 

Out[141]: 
    Col1 Col2 
0 A C 
1 B C 
2 C A 

UPDATE

如果您要添加的值,則可以調用apply並使用new_df值從cos DF執行查找:

In [144]: 
new_df['value'] = new_df.apply(lambda x: cos.loc[x['Col1'], x['Col2']], axis=1) 
new_df 

Out[144]: 
    Col1 Col2  value 
0 A C 0.368494 
1 B C 0.205053 
2 C A 0.368494 

事實上,你可以使用lookup

In [146]: 
new_df['value'] = cos.lookup(new_df['Col1'], new_df['Col2']) 
new_df 

Out[146]: 
    Col1 Col2  value 
0 A C 0.368494 
1 B C 0.205053 
2 C A 0.368494 
+0

好啊!我沒有想到這個。謝謝! –

+0

對不起還有一個問題,您如何將匹配值添加到new_df的新列?即我想看第一行的A,C,0.368494 –

1

爲什麼不使用排名方法獲得所有列的排名?

>>> ranking = cos.rank(ascending=False) 
>>> ranking 
    A B C 
A 1 3 2 
B 3 1 3 
C 2 2 1 
+1

是的,那麼我可以用2. –

+0

或者3或者4,或者你需要的任何值來選擇所有的行。 :) 加,它不需要你改變數據... – PabTorre