python - 如何为每个term保留k个最相似的term记录,并将不太相似的用0替换

标签 python pandas numpy

我有一个像这样的 pandas 数据框。

term by term matrix

它是一个逐个术语的相似度矩阵。对于一个nxn个逐个术语的相似度矩阵,我想保留k个记录,这是每个术语最相似的术语记录,并将其余的n-k个不太相似的记录替换为0。对于这个玩具示例,我想获得一个像这样的数据框 this

如果 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 编写此功能吗?

最佳答案

这是一种利用 NumPy's advanced indexing 的方法和 np.argpartition用于选择和重置每行适当数量的元素 -

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

关于python - 如何为每个term保留k个最相似的term记录,并将不太相似的用0替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43209923/

相关文章:

python - 如何在 Python 中设置嵌套类的显示名称?

python - 如何在多索引数据帧的最外层使用 iloc 切片?

python - Dask DataFrame.map_partition() 写入数据库表

python-3.x - 使用 Matplotlib 绘制二进制 Numpy 数组的边界

numpy - Python numpy 矩阵乘法与一个对角矩阵

python - 如何从bash脚本获取python脚本中目录路径的变量?

python - 如何检查 Pandas 系列是否为空?

python - 如何计算pandas数据框中从一个数据点到所有其他数据点的欧几里德距离之和?

python - 如何在 Matplotlib 中找到该数据的拟合趋势线?

python - 有没有办法使用 python pandas 进行批量分组?