2016-07-12 166 views
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

在隨後的時鐘在6和– 7毫秒(與30毫秒左右,你的方法把我的機器上)。

import io 

import pandas as pd 


raw_df = io.StringIO("""\ 
    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 
""") 
df = pd.read_csv(raw_df, delim_whitespace=True) 

raw_mat = io.StringIO("""\ 
    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 
""") 
mat = pd.read_csv(raw_mat, delim_whitespace=True) 


df['norm'] = df.groupby('id1')['weights'].transform('sum') 

m = pd.merge(df, mat, left_on='id2', right_index=True) 
m[mat.index] = m[mat.index].multiply(m['weights']/m['norm'], axis=0) 

output = m.groupby('id1')[mat.index].sum() 
output.columns.name = 'id2' 
print(output)  

輸出:

id2  2a  2b  2c  2d  2e  2f 
id1                
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 
+0

你是一個天才,現在對我原先的數據幀需要小於2秒......這秤完美,upvoted和接受,謝謝! – ysearka

+0

好吧我不好,是我的樣品(我的數據幀的1%)的正常工作,但對大的一個需要10分鐘。當我嘗試重新申請它,以獲得一個矩陣'id1' /'id1'我得到一個memorryerror .. – ysearka