2016-12-18 4 views
1

オリジナルデータフレームを発見していません値iだけSeabornはパンダの列に

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] 

プロット:N [3,6,8,10] DTEST [ 'numdept']である

plt.figure(figsize=(16, 8)) 
sb.boxplot(x="numyear", y="numgrade", hue="numdept", data=dtest) 

enter image description here

質問:なぜ "nummdeptが" あります3,6,8,10以外の値を示すプロットの凡例のカテゴリ?

問題はipythonノートブックに記載されていますが、コードを通常の環境に運んでいても再発します。 hereの提案を使用して、海兵隊関連の問題を回避しようとした。キャノピー1.7.4.3348、jupyter 1.0.0-15、パンダ0.19.0-1 matplotlibの1.5.1-9とseaborn 0.7.0-6

EDIT使用

:衝動的にを挿入プロットコードの前に次

grouped = dtest.groupby(['numdept', 'numyear']) 
grouped.mean() 

出力はdtestには存在しないはずnumdept値を持ちます。

enter image description here

これはパンダのバグがありますか?

+0

これは私の予想どおりです。何が間違っていると思いますか? – josh

+0

@joshプロットの凡例は3、6、8、10のみ表示すべきですか? – user2738815

+0

@josh良いアイデア:) – user2738815

答えて

2

、以下を使用して、これを一般化することができます。凡例は、実際に存在する値ではなく、カテゴリ変数のカテゴリに基づいているようです。カテゴリ変数は、データに実際には存在しないカテゴリを表してもよく、これらのカテゴリは凡例にも表示されます。

the documentationで提案されているように、空のカテゴリを削除するにはdtest.numdept.cat.remove_unused_categories()を実行できます。

3

なぜこのようなことが起こっているのかはわかりませんが、希望の凡例を使用するには簡単な方法があります。

#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を追加して、私は見てみたい正確な値(Iは非数値これを強調するために選択した)順番を指定しています。 [1, 2, 3, 6, 8, 10]と指定すると、これらは伝説となります。

Boxplt example

最後に、あなたは素敵なあなたがカテゴリ変数を使用している

sns.boxplot(x="numyear", y="numgrade", hue="numdept", data=dtest, 
      hue_order=dtest.numdept.unique().sort(), width=0.2) 
+0

ニース、「これを強調するために非数字を選んだ」という意味を説明できますか? 'hue_order'の引数は数字ではなく、数値ではないようです。 – ImportanceOfBeingErnest

+0

数値以外の順序です。私はそれをより意味をなさせるために "注文"を追加しました:) – josh

+0

あなたの助けを借りてありがとうございますupvoting。しかし、私は元の質問に対する答えも欲しい。これがなぜ起こっているのかを知ることで、将来これらのパッケージのどれを使用するか、どのように使用するかに影響を与える可能性があります。 – user2738815