Seaborn报错‘Input data must be a pandas object to reorder’问题求助
问题排查与解决
错误原因
Seaborn 0.12版本对countplot()的API调用逻辑做了调整:
- 不能直接将pandas Series作为第一个位置参数传入,必须显式指定
x(或y)参数绑定数据。直接传Series会导致Seaborn无法正确识别数据结构,进而触发"Input data must be a pandas object to reorder"错误。 - 代码中
plt.setp(axs[i])属于无效调用,plt.setp需要明确指定要设置的属性(比如刻度标签样式),这行代码无实际作用,甚至可能引发额外问题。
修复后的完整代码
import matplotlib.pyplot as plt import seaborn as sns import pandas as pd sns.set(style='white') df = pd.read_csv("https://storage.googleapis.com/dqlab-dataset/customer_segments.txt", sep="\t") plt.clf() # 准备分类列 kolom_kategorikal = ['Jenis Kelamin','Profesi','Tipe Residen'] # 创建画布 fig, axs = plt.subplots(3,1,figsize=(7,10)) # 为每个分类列创建图表 for i, kol in enumerate(kolom_kategorikal): # 修改countplot调用,显式指定x参数 sns.countplot(x=df[kol], order=df[kol].value_counts().index, ax=axs[i]) axs[i].set_title(f'\nCount Plot {kol}\n', fontsize=15) # 添加注释 for p in axs[i].patches: axs[i].annotate(format(p.get_height(), '.0f'), (p.get_x() + p.get_width() / 2., p.get_height()), ha='center', va='center', xytext=(0, 10), textcoords='offset points') # 设置图表 sns.despine(right=True, top=True, left=True) axs[i].axes.yaxis.set_visible(False) # 若需调整刻度样式可按需添加,比如旋转x轴标签: # plt.setp(axs[i].get_xticklabels(), rotation=45) plt.tight_layout() # 显示图表 plt.show()
关键修改点
- 将
sn.countplot(df[kol], ...)改为sn.countplot(x=df[kol], ...),显式指定数据对应的坐标轴。 - 删除无效的
plt.setp(axs[i])调用,若需要调整刻度标签等样式,可补充具体参数。
内容的提问来源于stack exchange,提问作者Margubillah
相关产品推荐
相关产品推荐

