我无法弄清楚解决此问题的包/逻辑流程最有效。我有一本这样的字典(为了便于阅读,已缩短了值列表):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条经验 获得超4个赞
一种方法是首先根据字典计算重叠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
提交
取消