【问题标题】:Seaborn showing values not found in Pandas columnsSeaborn 显示 Pandas 列中未找到的值
【发布时间】:2017-05-03 10:18:15
【问题描述】:

原始数据框:

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 中。

这是否使它成为熊猫错误?

【问题讨论】:

  • 这看起来符合我的预期。你到底觉得哪里不对?
  • @josh 情节图例不应该只显示 3、6、8、10 吗?
  • @josh 好主意 :)
  • 使用以下命令可以得到您所期望的 4 值图例:dp = pd.concat([pd.DataFrame(np.random.randint(1, 4, [100, 1])), pd.DataFrame(np.random.randint(1, 14, [100, 1])), pd.DataFrame([3]*20 + [6]*20 + [8]*20 + [10]*20 + [11]*20)], axis=1)。抱歉,它不是很整洁。不知道为什么你的不只显示 4 个。
  • 原始数据帧是如何生成的?任何列都是分类的吗?

标签: python pandas matplotlib seaborn


【解决方案1】:

为什么会发生这种情况我不确定,但有一种简单的方法可以让它使用你想要的 [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)

【讨论】:

  • 很好,您能解释一下“我选择非数字来强调这一点”是什么意思吗? hue_order 的参数似乎是数字,而不是非数字。
  • 非数字顺序。我添加了“订单”以使其更有意义:)
  • 非常感谢您的支持。但是,我也想回答原始问题。知道为什么会发生这种情况可能会影响我将来是否以及如何使用这些软件包中的任何一个。
  • 当然。明天我会再看一看,看看我是否可以补充我的问题。
【解决方案2】:

您正在使用分类变量。看来图例是基于分类变量中的类别,而不是实际存在的值。分类变量可能代表数据中实际不存在的类别,这些类别仍然显示在图例中。

按照the documentation 的建议,您可以通过dtest.numdept.cat.remove_unused_categories() 删除空类别。

【讨论】:

    猜你喜欢
    • 2020-06-13
    • 2018-06-02
    • 1970-01-01
    • 2020-03-23
    • 2017-08-30
    • 1970-01-01
    • 2020-04-26
    • 2017-09-09
    • 1970-01-01
    相关资源
    最近更新 更多