如何对含ID与division列的DataFrame同列透视并生成热力图
生成适合热力图的ID-Division计数透视表
嘿,针对你的需求,我们可以快速生成一个以ID为行、division为列,值为对应出现次数的透视表,这种结构完美适配热力图的输入。下面是一步步的实现方案:
1. 先准备好示例数据
首先导入依赖库并创建你提供的DataFrame:
import pandas as pd import numpy as np # 创建示例数据 df = pd.DataFrame( np.array([['111', 'AAA'],['222','AAA'],['333','BBB'],['444','CCC'],['444','AAA'],['222','BBB'],['111','BBB']]), columns=['ID','division'] )
2. 生成透视计数表(两种方法任选)
我们需要统计每个ID在各个division中的出现次数,这里有两种常用的实现方式:
方法一:用pd.crosstab(最直接)
crosstab是Pandas专门用来计算交叉频数的工具,一行代码就能搞定:
# 生成透视表,fill_value=0保证没有出现的组合填充为0,适合热力图展示 pivot_result = pd.crosstab(df['ID'], df['division'], fill_value=0)
方法二:用pivot_table
如果你更习惯用透视表的通用写法,可以这样:
pivot_result = df.pivot_table( index='ID', # 行是ID columns='division', # 列是division aggfunc='size', # 统计出现次数 fill_value=0 # 缺失值填0 )
两种方法得到的结果完全一致,输出的透视表长这样:
division AAA BBB CCC ID 111 1 1 0 222 1 1 0 333 0 1 0 444 1 0 1
3. 转换为数组格式(可选)
如果需要转换成你示例中的纯数组形式,直接调用to_numpy()即可:
result_array = pivot_result.to_numpy() # 输出:array([[1, 1, 0], [1, 1, 0], [0, 1, 0], [1, 0, 1]], dtype=int64)
小提示
- 一定要加
fill_value=0:这样所有division列都会保留,不会因为某个ID没出现过就丢列,热力图展示的时候不会有空白块,完整性更好。 - 这个结构的透视表可以直接传给
seaborn.heatmap()这类热力图工具,不需要额外调整格式。
内容的提问来源于stack exchange,提问作者HKE
相关产品推荐
相关产品推荐

