原始数据框:
dp.head(10)
使用推荐的选择方法创建新数据框:
dtest = pd.DataFrame(dp[dp['numdept'].isin([3,6,8,10])]).dropna()
dtest.reset_index(drop =True, inplace = True)
dtest.head(10)
测试以确保只有 [3,6,8,10] 中的值在 dtest['numdept'] 中:
print "numdept is 5:", dtest[dtest["numdept"].isin ([5])]
print "set of distinct values in the numdept column:", sorted(set(dtest['numdept'].tolist()))
>> numdept is 5: Empty DataFrame
>> Columns: [numgrade, numyear, numdept]
>> Index: []
>> set of distinct values in the numdept column: [3, 6, 8, 10]
绘图:
plt.figure(figsize=(16, 8))
sb.boxplot(x="numyear", y="numgrade", hue="numdept", data=dtest)
问题:为什么图例中的“nummdept”类别显示的值不是 3、6、8、10?
问题出现在 ipython 笔记本中,但即使我将代码带到常规环境中也会重复出现。还尝试通过使用建议来避免 seaborn 相关问题 here , 无济于事。
使用 Canopy 1.7.4.3348、jupyter 1.0.0-15、pandas 0.19.0-1 matplotlib 1.5.1-9 和 seaborn 0.7.0-6
编辑:一时冲动,在绘图代码前插入以下内容:
grouped = dtest.groupby(['numdept', 'numyear'])
grouped.mean()
输出具有 numdept 值,不应存在于 dtest 中。
这是否使其成为 pandas 错误?
请您参考如下方法:
您正在使用分类变量。看起来图例是基于分类变量中的类别,而不是实际存在的值。分类变量可能表示数据中实际上没有出现的类别,这些类别仍显示在图例中。
如 the documentation 中的建议,您可以执行 dtest.numdept.cat.remove_unused_categories() 删除空类别。
