最近學(xué)習(xí)coursera上的 How to Win a Data Science Competition: Learn from Top Kagglers 的課程,在完成其中一個(gè)jupyter notebook的作業(yè)時(shí)敌蚜,遇到了一個(gè)問題桥滨,想寫一篇關(guān)于這個(gè)問題解決方案的文章。
問題:給定一個(gè)dataframe弛车,如果其中兩列的數(shù)值同時(shí)出現(xiàn)该园,在稀疏矩陣中相應(yīng)的位置賦值為1,否則為0帅韧,該稀疏矩陣也可以稱作Incidence matrix。?
我使用scipy.sparse.coo_matrix((data, (row, col))) 方法創(chuàng)建稀疏矩陣啃勉,還有其他的方法可以創(chuàng)建正確的稀疏矩陣忽舟,感興趣的小伙伴可以自行搜索,并歡迎在下方留言淮阐,供大家學(xué)習(xí)叮阅。
假設(shè)我們的dataframe如下圖所示,要?jiǎng)?chuàng)建一個(gè)稀疏矩陣泣特,當(dāng)a和b的數(shù)據(jù)(i浩姥,j)同時(shí)出現(xiàn)時(shí),稀疏矩陣在(i状您,j)位置的值為1勒叠,其余地方的值都為0:
首先明確我們想要得到的稀疏矩陣的形式,如下膏孟,并且空白的地方都是0:
明確了稀疏矩陣長什么樣之后眯分,如何使用scipy.sparse.coo_matrix函數(shù),創(chuàng)建一個(gè)相應(yīng)的稀疏矩陣呢柒桑?
coo_matrix 函數(shù)需要接收三個(gè)參數(shù)弊决,data,row 和 col魁淳。下面通過上述的例子飘诗,簡述我是如何確定這三個(gè)參數(shù)的。
第一步界逛,合并“a” 和 “b” 中的數(shù)值昆稿,分別以?“a”—> "b" 的順序和“b”—>“a”的順序合并,暫且稱作我們的dataframe 為df仇奶。具體方式如下:
row_temp = df.a.append(df.b)
col_temp = df.b.append(df.a)
第二步貌嫡,按照列合并row_temp 和?col_temp比驻,目的是為了刪除重復(fù)的行,可以看到在我們的例子中有(0岛抄,5)和(5别惦,0)這樣的兩對,當(dāng)我們只有(0夫椭,5)或者只有(5掸掸,0)這樣一對的時(shí)候,就會在稀疏矩陣的(0蹭秋,5)和(5扰付,0)的位置都填上1,所以我們要?jiǎng)h除其中的一對仁讨,保證我們的稀疏矩陣中只包含數(shù)值0或者數(shù)值1羽莺。
df_temp = pd.concat([row_temp, col_temp], axis=1)
df_temp = df_temp.drop_duplicates()
第三步,明確row和col參數(shù)
row = df_temp[0]
col = df_temp[1]
第四步洞豁,明確data參數(shù)
data = np.ones(len(row))
第五步盐固,找到了data,row和col參數(shù)丈挟,將它們填入到coo_matrix函數(shù)刁卜,創(chuàng)建稀疏矩陣
sp_mat = scipy.sparse.coo_matrix((data, (row, col)),dtype=int)
第六步,判斷我們生成的稀疏矩陣是否正確
assert sp_mat.max() == 1
如果想看到更加詳細(xì)的說明與code曙咽,可以點(diǎn)擊這里蛔趴,進(jìn)入到我的github中查看。