0
我有一個數據幀df
它看起來像這樣:創建從熊貓數據幀和矩陣的新矩陣
2a 2b 2c 2d 2e 2f
2a 1 0.5 0.7 0.2 0.1 0.3
2b 0.5 1 0.6 0.4 0.3 0.4
2c 0.7 0.6 1 0.1 0.4 0.2
2d 0.2 0.4 0.1 1 0.8 0.7
2e 0.1 0.3 0.4 0.8 1 0.8
2f 0.3 0.4 0.2 0.7 0.8 1
現在:
id1 id2 weights
0 a 2a 144.0
1 a 2b 52.5
2 a 2c 2.0
3 a 2d 1.0
4 a 2e 1.0
5 b 2a 2.0
6 b 2e 1.0
7 b 2f 1.0
8 b 2b 1.0
9 b 2c 0.008
和相似度矩陣id2
列的元素之間mat
我想創建的id1
的元素和從id2
所述元件之間的相似性矩陣。對於我考慮的id1
元素作爲id2
IND我數據框df
相應元素的質心(與相應weights
)。
我的第一個這樣做的企圖均不符合循環(aouch):
ids = df.id1.unique()
output = pd.DataFrame(columns = mat.columns,index = ids)
for id in ids:
df_slice = df.loc[df.id1 == id]
to_normalize = df_slice.weights.sum()
temp = mat.loc[df_slice.id2]
for art in df_slice.id2:
temp.loc[art] *= df_slice.ix[df_slice.id2 == art,'weights'].values[0]
temp.loc[art] /= (1.*to_normalize)
output.loc[id] = temp.sum()
不過,當然這是後不Python的,並需要年齡(timeit
對於這些小矩陣顯示21.3ms
不可計算的10k-行df
和3K mat
3K)。什麼會是更乾淨/有效的方式來做到這一點?
希望的輸出:
2a 2b 2c 2d 2e 2f
a 0.857606 0.630424 0.672319 0.258354 0.163342 0.329676
b 0.580192 0.540096 0.520767 0.459425 0.459904 0.559425
而且是有辦法來計算的id1
(從該數據)的元素之間的另一相似性矩陣?
預先感謝您。
你是一個天才,現在對我原先的數據幀需要小於2秒......這秤完美,upvoted和接受,謝謝! – ysearka
好吧我不好,是我的樣品(我的數據幀的1%)的正常工作,但對大的一個需要10分鐘。當我嘗試重新申請它,以獲得一個矩陣'id1' /'id1'我得到一個memorryerror .. – ysearka