当使用Seaborn绘制groupby图表时出现“无法解释输入”错误

27

假设我有这个数据框:

d = {     'Path'   : ['abc', 'abc', 'ghi','ghi', 'jkl','jkl'],
          'Detail' : ['foo', 'bar', 'bar','foo','foo','foo'],
          'Program': ['prog1','prog1','prog1','prog2','prog3','prog3'],
          'Value'  : [30, 20, 10, 40, 40, 50],
          'Field'  : [50, 70, 10, 20, 30, 30] }


df = DataFrame(d)
df.set_index(['Path', 'Detail'], inplace=True)
df

               Field Program  Value
Path Detail                      
abc  foo        50   prog1     30
     bar        70   prog1     20
ghi  bar        10   prog1     10
     foo        20   prog2     40
jkl  foo        30   prog3     40
     foo        30   prog3     50

我可以轻松地汇总它(如果有更好的方法,请告诉我!)

df_count = df.groupby('Program').count().sort(['Value'], ascending=False)[['Value']]
df_count

Program   Value
prog1    3
prog3    2
prog2    1

df_mean = df.groupby('Program').mean().sort(['Value'], ascending=False)[['Value']]
df_mean

Program  Value
prog3    45
prog2    40
prog1    20

我可以毫不费力地在 Pandas 中绘制它...

df_mean.plot(kind='bar')

但是为什么我在 seaborn 中尝试时会收到这个错误?

sns.factorplot('Program',data=df_mean)
    ---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-26-23c2921627ec> in <module>()
----> 1 sns.factorplot('Program',data=df_mean)

C:\Anaconda3\lib\site-packages\seaborn\categorical.py in factorplot(x, y, hue, data, row, col, col_wrap, estimator, ci, n_boot, units, order, hue_order, row_order, col_order, kind, size, aspect, orient, color, palette, legend, legend_out, sharex, sharey, margin_titles, facet_kws, **kwargs)
   2673     # facets to ensure representation of all data in the final plot
   2674     p = _CategoricalPlotter()
-> 2675     p.establish_variables(x_, y_, hue, data, orient, order, hue_order)
   2676     order = p.group_names
   2677     hue_order = p.hue_names

C:\Anaconda3\lib\site-packages\seaborn\categorical.py in establish_variables(self, x, y, hue, data, orient, order, hue_order, units)
    143                 if isinstance(input, string_types):
    144                     err = "Could not interperet input '{}'".format(input)
--> 145                     raise ValueError(err)
    146 
    147             # Figure out the plotting orientation

ValueError: Could not interperet input 'Program'

1
我在错误使用sns.FacetGrid.map而不是sns.FacetGrid.map_dataframe时遇到了这个错误。 - filups21
1个回答

30

你遇到异常的原因是在group_by操作之后,Program变成了数据框df_meandf_count的索引。

如果你想从df_mean中获取factorplot,一个简单的解决方案是将索引添加为一列,

In [7]:

df_mean['Program'] = df_mean.index

In [8]:

%matplotlib inline
import seaborn as sns
sns.factorplot(x='Program', y='Value', data=df_mean)

然而,您甚至可以更简单地让 factorplot 为您进行计算。

sns.factorplot(x='Program', y='Value', data=df)

你将获得相同的结果。

在评论后编辑

确实,你很好地指出了关于参数as_index的一点;默认情况下它被设置为True,在这种情况下,Program成为索引的一部分,就像你的问题中一样。

In [14]:

df_mean = df.groupby('Program', as_index=True).mean().sort(['Value'], ascending=False)[['Value']]
df_mean

Out[14]:
        Value
Program 
prog3   45
prog2   40
prog1   20

为了更清晰明白,这种方式中 Program 不再是列名,而是变成了索引。技巧在于 df_mean['Program'] = df_mean.index 实际上保留了索引原有的形式,并添加了一个新的列作为索引,从而使得现在出现了重复的 Program

In [15]:

df_mean['Program'] = df_mean.index
df_mean

Out[15]:
        Value   Program
Program     
prog3   45  prog3
prog2   40  prog2
prog1   20  prog1

但是,如果您将as_index设置为False,则会得到Program作为一列,以及一个新的自动增量索引。

In [16]:

df_mean = df.groupby('Program', as_index=False).mean().sort(['Value'], ascending=False)[['Program', 'Value']]
df_mean

Out[16]:
    Program Value
2   prog3   45
1   prog2   40
0   prog1   20

使用这种方法,您可以直接将其提供给seaborn。不过,您也可以使用df并获得相同的结果。


非常感谢您的回复。起初我以为这是一个索引问题。但是根据文档所述,“as index”参数默认为True,因此组标签(即“Program”)已经是索引了。 df_mean.index Index(['prog3', 'prog2', 'prog1'], dtype='object', name='Program')我尝试了第二种方法,但仍然收到相同的错误。 - marshallbanana
我不确定我们是否理解彼此。无论如何,你对于as_index参数提出了一个很好的观点,我正在更新答案。希望现在更清楚了。 - lrnzcig
抱歉 - 我刚意识到我们关于索引的说法是一样的。我认为factorplot默认应该能够使用索引作为x轴。所以我很困惑你的第二个解决方案返回相同的错误。 - marshallbanana
1
抱歉,我打错了。第二个解决方案是sns.factorplot(x='Program', y='Value', data=df),这意味着您可以直接使用df。希望现在更清楚了。 - lrnzcig
非常感谢。我看到我的错误在于x值需要是一列,而不是一个索引。 - marshallbanana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接