Seaborn 显示 Pandas 列中未找到的值
Seaborn showing values not found in Pandas columns
原始数据框:
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 笔记本中,但即使我将代码带到常规环境中也会重复出现。还尝试通过使用建议 here 来避免与 seaborn 相关的问题,但无济于事。
使用 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 错误吗?
我不确定为什么会这样,但是有一种简单的方法可以让它使用您想要的 [3, 6, 8, 10]
图例。
#Create mock data
dp = pd.concat([pd.DataFrame(np.random.randint(1, 4, [100, 1])),
pd.DataFrame(np.random.randint(1, 14, [100, 1])),
pd.DataFrame([3.0]*20 + [6.0]*20 + [8.0]*20 + [10.0]*20 + [11.0]*20)], axis=1)
dp.columns = ["numyear", "numgrade", "numdept"]
dtest = pd.DataFrame(dp[dp['numdept'].isin([3,6,8,10])]).dropna()
dtest.reset_index(drop=True, inplace=True)
sns.boxplot(x="numyear", y="numgrade", hue="numdept", data=dtest,
hue_order=[10, 3 , 8, 6])
我在这里添加了一个 hue_order 并指定了顺序(我选择了非数字顺序来强调这一点)和我希望看到的确切值。如果指定 [1, 2, 3, 6, 8, 10]
它将给出这些作为图例。
最后,您可以使用以下内容很好地概括这一点,
sns.boxplot(x="numyear", y="numgrade", hue="numdept", data=dtest,
hue_order=dtest.numdept.unique().sort(), width=0.2)
您正在使用分类变量。看起来图例是基于分类变量中的类别,而不是实际存在的值。分类变量可能表示数据中实际上没有出现的类别,这些类别仍然显示在图例中。
按照 the documentation 中的建议,您可以 dtest.numdept.cat.remove_unused_categories()
删除空类别。
原始数据框:
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 笔记本中,但即使我将代码带到常规环境中也会重复出现。还尝试通过使用建议 here 来避免与 seaborn 相关的问题,但无济于事。
使用 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 错误吗?
我不确定为什么会这样,但是有一种简单的方法可以让它使用您想要的 [3, 6, 8, 10]
图例。
#Create mock data
dp = pd.concat([pd.DataFrame(np.random.randint(1, 4, [100, 1])),
pd.DataFrame(np.random.randint(1, 14, [100, 1])),
pd.DataFrame([3.0]*20 + [6.0]*20 + [8.0]*20 + [10.0]*20 + [11.0]*20)], axis=1)
dp.columns = ["numyear", "numgrade", "numdept"]
dtest = pd.DataFrame(dp[dp['numdept'].isin([3,6,8,10])]).dropna()
dtest.reset_index(drop=True, inplace=True)
sns.boxplot(x="numyear", y="numgrade", hue="numdept", data=dtest,
hue_order=[10, 3 , 8, 6])
我在这里添加了一个 hue_order 并指定了顺序(我选择了非数字顺序来强调这一点)和我希望看到的确切值。如果指定 [1, 2, 3, 6, 8, 10]
它将给出这些作为图例。
最后,您可以使用以下内容很好地概括这一点,
sns.boxplot(x="numyear", y="numgrade", hue="numdept", data=dtest,
hue_order=dtest.numdept.unique().sort(), width=0.2)
您正在使用分类变量。看起来图例是基于分类变量中的类别,而不是实际存在的值。分类变量可能表示数据中实际上没有出现的类别,这些类别仍然显示在图例中。
按照 the documentation 中的建议,您可以 dtest.numdept.cat.remove_unused_categories()
删除空类别。