2017-03-13 12 views
6

नमूना डेटा के एक साल:साइड-बाई-साइड एक पांडा DataFrame की एकाधिक स्तंभों के boxplot

import pandas as pd 
import numpy.random as rnd 
import seaborn as sns 
n = 365 
df = pd.DataFrame(data = {"A":rnd.randn(n), "B":rnd.randn(n)+1}, 
        index=pd.date_range(start="2017-01-01", periods=n, freq="D")) 

मैं इन आंकड़ों को साथ-पक्ष महीने (यानी, दो बक्से प्रति के आधार पर वर्गीकृत boxplot करना चाहते हैं माह, A के लिए एक और B के लिए एक)। एक कॉलम के लिए sns.boxplot(df.index.month, df["A"]) ठीक काम करता है। हालांकि, sns.boxplot(df.index.month, df[["A", "B"]]) एक त्रुटि फेंकता है (ValueError: cannot copy sequence with size 2 to array axis with dimension 365)। सूचकांक (pd.melt(df, id_vars=df.index, value_vars=["A", "B"], var_name="column")) द्वारा डेटा को पिघलने के लिए सीबर्न की hue संपत्ति को वर्कअराउंड के रूप में उपयोग करने के लिए या तो (TypeError: unhashable type: 'DatetimeIndex') काम नहीं करता है।

(ए समाधान जरूरी Seaborn उपयोग करने की आवश्यकता नहीं है, तो यह आसान है सादा matplotlib इस्तेमाल करते हैं।)

/संपादन: मैं एक वैकल्पिक हल में पाया गया कि मूल रूप से पैदा करता है कि मैं क्या चाहता हूँ। हालांकि, डेटाफ्रेम में प्लॉट करना चाहते हैं, उससे अधिक चर शामिल होने के साथ काम करने के लिए यह कुछ अजीब हो जाता है। तो यदि ऐसा करने के लिए एक और अधिक सुरुचिपूर्ण/सीधा तरीका है, तो कृपया साझा करें!

df_stacked = df.stack().reset_index() 
df_stacked.columns = ["date", "vars", "vals"] 
df_stacked.index = df_stacked["date"] 
sns.boxplot(x=df_stacked.index.month, y="vals", hue="vars", data=df_stacked) 

का उत्पादन: Side-by-side boxplot of A and B, grouped by month.

उत्तर

0

मैं पूरी तरह से अपने प्रश्न समझ में नहीं आता है, लेकिन आप इस दृष्टिकोण matplotlib का उपयोग कर पर एक नज़र लेने के लिए हो सकता है। हालांकि सबसे अच्छा समाधान नहीं है।

1) 12 DataFrames में तोड़ dfmonth द्वारा, सभी एक सूची में खड़ी

DFList = [] 
for group in df_3.groupby(df_3.index.month): 
    DFList.append(group[1]) 

2) उन्हें एक पाश में एक के बाद एक प्लॉट:

for _ in range(12): 
    DFList[_].plot(kind='box', subplots=True, layout=(2,2), sharex=True, sharey=True, figsize=(7,7)) 

plt.show() 

3) यहाँ एक है 1 तीन पंक्तियों का स्नैपशॉट:

enter image description here

तुम भी चेकआउट करने matplotlib के add_subplot method

+0

अपने जवाब के लिए धन्यवाद करना चाहते हैं। क्षमा करें अगर मेरा मुख्य पोस्ट अस्पष्ट है। मुझे खुशी होगी अगर आप इसे सुधारने में मेरी मदद कर सकते हैं। मैं एक वर्कअराउंड/समाधान संपादित करूंगा जो मैंने मूल पोस्ट में एक मिनट में पाया था ताकि मेरा मतलब स्पष्ट हो सके। –

संबंधित मुद्दे