如何基于Pandas DataFrame两列生成共有值交叉计数热图
实现方案
直接通过矩阵运算实现,是当前场景下效率最高的方案,全程只需3步:
1. 生成A-B的0-1关联矩阵
用crosstab快速生成行是B值、列是A值的0-1矩阵,值为1代表对应A包含该B值:
import pandas as pd ab_matrix = pd.crosstab(df['B'], df['A'])
2. 矩阵乘法计算共现计数
转置后和原矩阵点乘,直接得到两两A的共有B值计数矩阵,完全符合你需要的交叉透视表格式:
cross_count = ab_matrix.T.dot(ab_matrix)
该结果对角线的值为对应A本身包含的B值总数,非对角线值就是两个不同A的共有B值数量,和你给出的示例格式完全一致。
3. 绘制热图
直接用seaborn的heatmap接口渲染即可:
import seaborn as sns import matplotlib.pyplot as plt plt.figure(figsize=(8, 6)) # annot=True显示数值,fmt='d'代表用整数格式展示 sns.heatmap(cross_count, annot=True, cmap='Blues', fmt='d') plt.xlabel('A取值') plt.ylabel('A取值') plt.title('不同A取值共有B值数量热图') plt.show()
方案优势
无需循环遍历A的两两组合做交集计算,全程调用numpy优化的矩阵运算接口,即使A的取值达到数千级别也能快速出结果,远高于常规循环方案的效率。
内容的提问来源于stack exchange,提问作者harry04
相关产品推荐
相关产品推荐

