You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 00:20:46