如何从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
答案 0 :(得分:2)
您只需将1
替换为任意值,然后像以前一样致电idxmax
和reset_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