如何让Seaborn热力图的Name索引保持原始顺序而非字母排序
问题描述
使用Seaborn绘制热力图时出现ValueError: could not convert string 'Henry' to float,通过pivot操作解决了该问题,但pivot后作为index的Name列被自动按字母排序,希望保留原始数据中的顺序:Henry → Bob → Johnny。
现有代码
df = pd.read_csv('data.csv') df1 = df.pivot(index='Name', columns='Years', values='Apples') sns.heatmap(df1)
原始数据(data.csv)
| Name | Years | Apples |
|---|---|---|
| Henry | 2020 | 2 |
| Bob | 2020 | 2 |
| Johnny | 2020 | 1 |
| Henry | 2021 | 6 |
| Bob | 2021 | 2 |
| Johnny | 2021 | 1 |
解决方案
可行,以下两种方法均可实现:
方法1:将Name设为有序分类
在pivot前把Name列转为有序分类,指定原始出现顺序,pivot时会遵循该顺序:
import pandas as pd import seaborn as sns df = pd.read_csv('data.csv') # 获取原始数据中Name的唯一出现顺序 name_order = df['Name'].unique().tolist() # 转换为有序分类 df['Name'] = pd.Categorical(df['Name'], categories=name_order, ordered=True) # 执行pivot df1 = df.pivot(index='Name', columns='Years', values='Apples') sns.heatmap(df1)
方法2:pivot后重新排列index
先完成pivot,再手动按照原始顺序重置index:
import pandas as pd import seaborn as sns df = pd.read_csv('data.csv') df1 = df.pivot(index='Name', columns='Years', values='Apples') # 指定原始顺序 name_order = ['Henry', 'Bob', 'Johnny'] # 重新排列index df1 = df1.reindex(name_order) sns.heatmap(df1)
方法1适合需多次保持顺序的场景,方法2更直接简洁。
内容的提问来源于stack exchange,提问作者HubAccess
相关产品推荐
相关产品推荐

