Python 如何为每个术语保留k个最相似的术语记录,并用0替换不太相似的术语记录
我有一个像这样的数据框 这是一个逐项相似矩阵。对于nxn逐项相似矩阵,我想保留k条记录,这是每个项的最相似项记录,并用0替换其余n-k条不太相似的记录。对于这个玩具示例,我想得到一个数据帧,如 如果k=2Python 如何为每个术语保留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',
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