如何从pandas数据帧中找到第二个最大值(余弦相似度矩阵)

时间:2015-09-04 14:56:48

标签: pandas max cosine-similarity

如何从pandas dataframe(余弦相似度矩阵)中找到第二个max或max其中index!= column?我可以遍历每一列并做索引!=列,但我相信有更好的方法...

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

我可以做这样的事情并获得第二个最大值而不是最大值吗?

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

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

2 个答案:

答案 0 :(得分: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

<强>更新

如果您想添加值,则可以调用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

答案 1 :(得分:1)

为什么不使用排名方法来获取所有列的排名?

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