2017-04-04 22 views
1

我有一個像這樣的熊貓數據框。如何爲每個術語保留k個最相似的術語記錄並用0替換不太相似的術語

term by term matrix

這是一個逐項相似matrix.For通過長期的相似矩陣NxN的名詞,我想保持K記錄是每個術語最相似期限的記錄,更換NK其餘少與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'] 

您能否告訴我如何在應用大矩陣時用熊貓編碼此功能。

回答

1

下面是一種方法利用的NumPy's advanced indexingnp.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 
1

方式一:

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爲假條件值