如何在Pandas中排序交叉表数据以生成聚类更紧密的热力图
解决方案:实现高频关联优先的热力图排序
方法1:按频次总和手动排序(对应你Excel的操作逻辑)
直接通过Pandas计算行/列的总频次,对交叉表的行和列进行降序排列,确保高频关联落在左上角,全程无需手动操作Excel:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 1. 生成交叉表(替换成你的原始数据) df = pd.DataFrame({ "CatA": ["A1", "A1", "A2", "A3", "A1", "A2", "A2", "A3"], "CatB": ["B1", "B2", "B1", "B3", "B1", "B2", "B1", "B3"] }) cross_tab = pd.crosstab(df["CatA"], df["CatB"]) # 2. 按行总频次降序排序行索引(CatA) sorted_row_idx = cross_tab.sum(axis=1).sort_values(ascending=False).index # 按列总频次降序排序列索引(CatB) sorted_col_idx = cross_tab.sum(axis=0).sort_values(ascending=False).index # 3. 重新生成排序后的交叉表 sorted_cross_tab = cross_tab.loc[sorted_row_idx, sorted_col_idx] # 4. 绘制热力图 plt.figure(figsize=(8, 6)) sns.heatmap(sorted_cross_tab, annot=True, fmt="d", cmap="Blues") plt.title("High-Frequency Associations Top-Left") plt.show()
这个方法完全复刻你在Excel里的逻辑,但全程用代码实现,排序后的sorted_cross_tab是标准的Pandas DataFrame,直接可以用于热力图绘制,解决你手动处理后无法转回DataFrame的问题。
方法2:层次聚类排序(让关联更紧密的最优方案)
如果希望聚类效果更明显,让相似关联的行/列自动聚在一起,可以用Seaborn的clustermap,它会自动对行和列进行层次聚类排序,高频组会自然聚集在左上角:
# 基于已排序的交叉表进行聚类(也可以直接用原始交叉表) g = sns.clustermap( sorted_cross_tab, annot=True, fmt="d", cmap="Blues", row_cluster=True, # 开启行聚类 col_cluster=True, # 开启列聚类 figsize=(8, 6) ) plt.show()
如果不需要聚类,只想保留按频次排序的结果,把row_cluster和col_cluster设为False即可。
关于你手动Excel操作的问题
你之前手动处理后无法转回DataFrame,大概率是因为Excel保存时丢失了行/列索引信息。用上述代码生成的排序表本身就是结构化的DataFrame,无需额外转换,直接用于可视化即可。
内容的提问来源于stack exchange,提问作者Rys
相关产品推荐
相关产品推荐

