2013-03-21 10 views
8

मैं एक पांडा DataFrame में एक वेतन स्तंभ की एक boxplot प्राप्त कर सकते हैं ...पांडा बॉक्सप्लॉट पर कस्टम कॉलम ऑर्डर कैसे लागू करें?

train.boxplot(column='PredictionError',by='Category',sym='') 

... लेकिन मैं समझ नहीं कैसे सूचकांक क्रम के स्तंभ 'श्रेणी' पर इस्तेमाल किया परिभाषित करने के लिए - मैं एक और कसौटी के अनुसार, मेरे स्वयं के कस्टम आदेश की आपूर्ति करना चाहते हैं:

category_order_by_mean_salary = train.groupby('Category')['Salary'].mean().order().keys() 

मैं कैसे boxplot कॉलम के लिए अपने कस्टम स्तंभ क्रम लागू कर सकते हैं? (ऑर्डर करने के लिए उपसर्ग के साथ स्तंभ नामों को बदसूरत करने के अलावा)

'श्रेणी' एक स्ट्रिंग कॉलम 27 विशिष्ट मान ले रहा है: ['Accounting & Finance Jobs','Admin Jobs',...,'Travel Jobs']। तो यह आसानी से pd.Categorical.from_array()

निरीक्षण पर साथ factorized जा सकता है, सीमा के अंदर pandas.tools.plotting.py:boxplot() है, जो आदेश की अनुमति के बिना स्तंभ वस्तु परिवर्तित करता है:

मुझे लगता है मैं या तो) पांडा boxplot के एक कस्टम संस्करण (ऊपर हैक कर सकता है, या वस्तु के आंतरिक भागों में पहुंच जाते हैं। और एक वृद्धि अनुरोध भी दर्ज करें।

संपादित करें: यह प्रश्न पांडा ~ 0.13 के साथ उभरा है और शायद @ सीरो के देर से उत्तर के अनुसार हाल ही में (0.1 9 +?) संस्करणों द्वारा अप्रचलित हो गया है।

उत्तर

6

यह कहना मुश्किल है कि बिना किसी काम के उदाहरण के इसे कैसे किया जाए। मेरा पहला अनुमान है कि आप जो आदेश चाहते हैं उसके साथ केवल एक पूर्णांक कॉलम जोड़ना होगा।

एक साधारण, ब्रूट-फोर्स तरीका एक समय में प्रत्येक बॉक्सप्लॉट को जोड़ना होगा।

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 

df = pd.DataFrame(np.random.rand(37,4), columns=list('ABCD')) 
columns_my_order = ['C', 'A', 'D', 'B'] 
fig, ax = plt.subplots() 
for position, column in enumerate(columns_my_order): 
    ax.boxplot(df[column], positions=[position]) 

ax.set_xticks(range(position+1)) 
ax.set_xticklabels(columns_my_order) 
ax.set_xlim(xmin=-0.5) 
plt.show() 

enter image description here

+0

जोड़ा गया विवरण आपके लिए, और कामकाज पर विचार। एक अलग स्टैंडअलोन पूर्णांक कॉलम जोड़ना एक सभ्य ग्राफ नहीं देता है क्योंकि अब आपके कॉलम लेबल (गैरकानूनी) पूर्णांक हैं, पाठ नहीं। (कस्टम सॉर्ट-ऑर्डर को मजबूर करने के लिए श्रेणी नामों में टेक्स्ट उपसर्ग को क्लॉड करना शायद सबसे तेज़ हैक है। लेकिन फिर भी बदसूरत) – smci

+0

[पांडा डेटाफ्रेम एक स्पष्ट कॉलम को संभाल नहीं सकता है] (http://stackoverflow.com/questions/15356433/how-to -जनेरेट-पांडा-डेटाफ्रेम-कॉलम-ऑफ-क्लासिकल-टू-स्ट्रिंग-कॉलम), आर – smci

+0

के विपरीत जहां मैं नेतृत्व नहीं कर रहा था। मैं आमतौर पर हार्ड-कोडेड लुकअप टेबल के साथ 'लागू' का उपयोग करता हूं। हालांकि, एक अलग दृष्टिकोण के लिए मेरी संपादित प्रतिक्रिया देखें। –

1

ध्यान दें कि पांडा अब स्पष्ट कॉलम बना सकते हैं। आप अपने ग्राफ में सभी स्तंभों वर्तमान, या उन्हें उचित ट्रिमिंग कोई आपत्ति नहीं है, तो आप नीचे की तरह कुछ कर सकते हैं:

http://pandas.pydata.org/pandas-docs/stable/categorical.html

df['Category'] = df['Category'].astype('category', ordered=True) 

हाल पांडा भी positions सभी पारित करने के लिए अनुमति देने के लिए प्रकट होता है फ्रेम से axes के माध्यम से रास्ता।

+0

ओह, उत्कृष्ट। उन्होंने किस संस्करण को जोड़ा? 0.20? – smci

+1

लिंक 0.15 ने कहा, लेकिन मुझे इसके बारे में संदेह था। मुझे यकीन नहीं है कि सुविधा उस बिंदु पर पूरी तरह से एकीकृत थी या नहीं। मैं यह सब '0.19.2' – Cireo

+0

में जांचने के लिए धन्यवाद करने में सक्षम था। – smci

1

एक अलग जवाब जोड़ना, जो शायद एक और सवाल हो सकता है - प्रतिक्रिया की सराहना की।

मैं एक समूह के भीतर एक कस्टम कॉलम ऑर्डर जोड़ना चाहता था, जिसने मेरे लिए कई समस्याएं उत्पन्न कीं। अंत में, मुझे groupby ऑब्जेक्ट से boxplot का उपयोग करने का प्रयास करने से बचना पड़ा, और इसके बजाय स्पष्ट स्थिति प्रदान करने के लिए प्रत्येक सबप्लॉट के माध्यम से जाना।

import matplotlib.pyplot as plt 
import pandas as pd 

df = pd.DataFrame() 
df['GroupBy'] = ['g1', 'g2', 'g3', 'g4'] * 6 
df['PlotBy'] = [chr(ord('A') + i) for i in xrange(24)] 
df['SortBy'] = list(reversed(range(24))) 
df['Data'] = [i * 10 for i in xrange(24)] 

# Note that this has no effect on the boxplot 
df = df.sort_values(['GroupBy', 'SortBy']) 
for group, info in df.groupby('GroupBy'): 
    print 'Group: %r\n%s\n' % (group, info) 

# With the below, cannot use 
# - sort data beforehand (not preserved, can't access in groupby) 
# - categorical (not all present in every chart) 
# - positional (different lengths and sort orders per group) 
# df.groupby('GroupBy').boxplot(layout=(1, 5), column=['Data'], by=['PlotBy']) 

fig, axes = plt.subplots(1, df.GroupBy.nunique(), sharey=True) 
for ax, (g, d) in zip(axes, df.groupby('GroupBy')): 
    d.boxplot(column=['Data'], by=['PlotBy'], ax=ax, positions=d.index.values) 
plt.show() 

मेरा अंतिम कोड के भीतर, यह निर्धारित करने के लिए पदों क्योंकि मैं प्रत्येक sortby मूल्य के लिए एक से अधिक डेटा अंक था यहां तक ​​कि थोड़ा और अधिक शामिल था, और मैं नीचे क्या करने वाले समाप्त हो गया:

to_plot = data.sort_values([sort_col]).groupby(group_col) 
for ax, (group, group_data) in zip(axes, to_plot): 
    # Use existing sorting 
    ordering = enumerate(group_data[sort_col].unique()) 
    positions = [ind for val, ind in sorted((v, i) for (i, v) in ordering)] 
    ax = group_data.boxplot(column=[col], by=[plot_by], ax=ax, positions=positions) 
+0

वैसे मूल प्रश्न वर्षों से बंद कर दिया गया है, इस जवाब के लिए एक नया प्रश्न क्यों नहीं जोड़ें? निर्दिष्ट करें पांडा 0.20+ – smci

+1

कोई प्रश्न पोस्ट करने के शिष्टाचार के बारे में निश्चित नहीं था, तो इसे स्वयं उत्तर दें =/ – Cireo

+0

जो बिल्कुल ठीक है। इसके अलावा इस मामले में वांछनीय - यह सवाल पांडा 0.1 9 द्वारा किसी बिंदु पर अप्रचलित हो गया है – smci

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