2015-10-02 71 views
4

說我有這個數據幀「無法解釋輸入」與Seaborn錯誤

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 

我可以從熊貓繪製它沒有問題... ...

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' 

回答

6

原因你所得到的例外是,您Program操作group_by後成爲dataframes df_meandf_count的索引。

如果你想從df_meanfactorplot,一個簡單的解決方案是將索引添加爲一列,

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並獲得相同的結果。

希望它有幫助。

+0

非常感謝回覆。起初我認爲這是一個索引問題。但根據[文檔](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.groupby.html),默認情況下'as index'參數爲True,因此組標籤(即'Program')已經是索引。 'df_mean.index' 'Index(['prog3','prog2','prog1'],dtype ='object',name ='Program')' 我嘗試了第二種方法,並收到相同的錯誤以及。 – marshallbanana

+0

我不確定我們互相瞭解。無論如何,你對'as_index'參數做了一個好點,我正在更新答案。希望現在更清楚。 – lrnzcig

+0

對不起 - 我只是意識到我們對這個指數說同樣的話。我認爲factorplot默認情況下能夠使用x軸的索引。所以我很困惑,你的第二個解決方案返回相同的錯誤 – marshallbanana