我無法弄清楚解決此問題的包/邏輯流程最有效。我有一本這樣的字典(為了便于閱讀,已縮短了值列表):dict = {'term_1': ['30939593', '30938516', '30930058', '30928978', '30927713', '30927284', '30925500', '30923740', '30922102', ...],'term_2': ['30931235', '30938516', '30928978', '30922102', '30858642', '30828702', '30815562', '30805732', '30766735', '30746412', '30740089', ...], etc. }在我列出的兩個術語之間,有三個值同時出現(30938516、30928978 和 30922102)。字典包含大約 1800 個鍵,每個鍵都有一個對應 ID 的值列表,其中一些列表可能有 100,000 個值。我希望能夠在熱圖中基于值列表中 ID 的共現來可視化字典中每個術語之間的相似程度。如在,熱圖的 x 軸和 y 軸將按順序用相同的術語標記,熱圖的每個單元格將通過計數有多少共現值來顯示一個術語和另一個術語之間 ID 的重疊(在這種情況下,term_1 和 term_2 之間的共現為 3)。這將對所有 1800 個術語重復,導致 1800x1800 熱圖。將值視為字符串,我嘗試將字典轉換為兩個數據框:一個是術語是列標題,值是按列列出的,另一個是術語是行標題,值是按行列出的.首先,我將字典轉換為數據框df = pd.DataFrame.from_dict(dict, orient = 'index')df = df[df.columns[0:]].apply( lambda x: ','.join(x.dropna().astype(str).astype(str)), axis = 1)但是,這只會將字典轉換為長度為 1800 的單列。我還需要找到一種方法來擴展數據框,以便每列復制 1800 次。一旦我有了這個 1800 x 1800 列,我就會轉置它。df_transposed = df.T如果我們要將要比較的數據幀的每組單元格視為兩個列表,我們可以像這樣處理每個比較l1 = ['30939593', '30938516', '30930058', '30928978', '30927713', '30927284', '30925500', '30923740', '30922102']l2 = ['30931235', '30938516', '30928978', '30922102', '30858642', '30828702', '30815562', '30805732', '30766735', '30746412', '30740089']from collections import Counterc = len(list((Counter(l1) & Counter(l2)).elements()))c = 3但是,我不確定如何在數據框的范圍內循環遍歷我想比較 1800x1800 網格的每個單元格,以便每個網格包含一個整數值,表示每個單元格中每個術語之間有多少共現 ID。然后我會將這個 1800x1800 的整數網格轉換為熱圖。
1 回答

收到一只叮咚
TA貢獻1821條經驗 獲得超5個贊
一種方法是首先根據字典計算重疊d,然后使用以下方法制作所需的數據幀pivot:
x = [(k1, k2, len(set(d1) & set(d2))) for k1,d1 in d.items() for k2,d2 in d.items()]
df = pd.DataFrame(x).pivot(index=0, columns=1, values=2)
print(df)
輸出:
1 term_1 term_2
0
term_1 9 3
term_2 3 11
當然,對于熱圖:
sns.heatmap(df)
輸出:
添加回答
舉報
0/150
提交
取消