Python 如何为每个术语保留k个最相似的术语记录,并用0替换不太相似的术语记录

Python 如何为每个术语保留k个最相似的术语记录,并用0替换不太相似的术语记录,python,pandas,numpy,Python,Pandas,Numpy,我有一个像这样的数据框 这是一个逐项相似矩阵。对于nxn逐项相似矩阵,我想保留k条记录,这是每个项的最相似项记录,并用0替换其余n-k条不太相似的记录。对于这个玩具示例,我想得到一个数据帧,如 如果k=2 frame=pd.DataFrame(data=np.array([[1,0.5,3,0.3],[0.5,1,0.3,0.4],[3,0.3,1,0.7],[0.3,0.4,0.7,1]]),columns=['w1','w2','w3','w4']) frame.index=['w1',

我有一个像这样的数据框

这是一个逐项相似矩阵。对于nxn逐项相似矩阵,我想保留k条记录,这是每个项的最相似项记录,并用0替换其余n-k条不太相似的记录。对于这个玩具示例,我想得到一个数据帧,如

如果k=2

frame=pd.DataFrame(data=np.array([[1,0.5,3,0.3],[0.5,1,0.3,0.4],[3,0.3,1,0.7],[0.3,0.4,0.7,1]]),columns=['w1','w2','w3','w4'])
frame.index=['w1','w2','w3','w4']
您能否告诉我,在将此功能应用于大矩阵时,如何使用pandas对其进行编码。

单向:

frame.where(frame.isin(frame.stack().sort_values(ascending=False).unique()[:k+1]), 0.0)
Out[88]: 
     w1   w2   w3   w4
w1  1.0  0.5  0.0  0.0
w2  0.5  1.0  0.0  0.0
w3  0.0  0.0  1.0  0.7
w4  0.0  0.0  0.7  1.0
说明:

  • 提取相关矩阵中的所有唯一值
  • 将唯一值按降序排序
  • 从该列表中选取k+1个元素+1计数跳过1.0对角线值
  • 计算值与数据帧匹配的布尔矩阵
  • 应用0.0作为假条件值的where筛选器

这里有一种方法,利用和选择并重置每行适当数量的元素-

k = 2 # no. of records to keep
a = frame.values # Extract the values as an array view
n = a.shape[1] - k # no. of elements to be reset per row
idx = np.argpartition(a,n,axis=1)[:,:n] # smallest n column indices per row
a[np.arange(idx.shape[0])[:,None], idx] = 0 # reset those in array/dataframe
样本运行-

In [478]: frame=pd.DataFrame(data=np.array([[1,0.5,0.2,0.3],[0.5,1,0.3,0.4],\
     ...:   [0.2,0.3,1,0.7],[0.3,0.4,0.7,1]]),columns=['w1','w2','w3','w4'])
     ...: frame.index=['w1','w2','w3','w4']
     ...: 

In [479]: frame
Out[479]: 
     w1   w2   w3   w4
w1  1.0  0.5  0.2  0.3
w2  0.5  1.0  0.3  0.4
w3  0.2  0.3  1.0  0.7
w4  0.3  0.4  0.7  1.0

## After code run with k=2

In [481]: frame
Out[481]: 
     w1   w2   w3   w4
w1  1.0  0.5  0.0  0.0
w2  0.5  1.0  0.0  0.0
w3  0.0  0.0  1.0  0.7
w4  0.0  0.0  0.7  1.0