Seaborn绘制KDE图遇变量类型错误,疑问是groupby还是绘图代码问题
问题:Seaborn KDE绘图报错,提示变量类型不符合要求
我执行了以下groupby聚合代码:
horus = df_clean.groupby(['profile_name','start_hour']).agg( count=('start_hour','count')).reset_index()
得到的数据集包含profile_name、start_hour、count三个字段(示例中AAA用户的start_hour覆盖0-23点,对应不同count值)。我想要绘制多组KDE分布图,执行以下代码时:
sns.kdeplot(data=hours, x="start_hour", hue="profile_name")
返回错误:
The x variable is categorical, but one of ['numeric', 'datetime'] is required
请问这是groupby操作的问题,还是Seaborn绘图代码的问题?
解答
- 问题根源既不是groupby操作,也不是绘图代码本身,而是**
start_hour字段的数据类型不符合要求**:Seaborn的kdeplot要求x轴变量必须是数值型(numeric)或日期时间型(datetime),但当前你的start_hour是分类类型(categorical)。 - 类型异常的原因:大概率是原始数据中
start_hour本身就是分类类型,或者在groupby聚合后被自动转换为分类类型。 - 解决步骤:
- 先转换
start_hour的数值类型:# 转换为整数型 horus['start_hour'] = horus['start_hour'].astype(int) # 若需要也可转换为浮点型 # horus['start_hour'] = horus['start_hour'].astype(float) - 修正绘图代码中的变量名笔误(你聚合得到的变量是
horus,但代码里写了hours),同时必须加上weights="count"参数——因为你的数据是聚合后的统计结果,需要用count作为权重来还原每个小时的实际样本量,否则KDE图会错误地将每个小时视为单个样本,导致结果失真:sns.kdeplot(data=horus, x="start_hour", hue="profile_name", weights="count")
- 先转换
内容的提问来源于stack exchange,提问作者Jakub Gabrych
相关产品推荐
相关产品推荐

