2013-02-21 27 views
11

मान लीजिए मैं इस तरह बनाया का एक DataFrame है:हिस्टोग्राम में पांडा DataFrame बारी तार के

import pandas as pd 
s1 = pd.Series(['a', 'b', 'a', 'c', 'a', 'b']) 
s2 = pd.Series(['a', 'f', 'a', 'd', 'a', 'f', 'f']) 
d = pd.DataFrame({'s1': s1, 's2', s2}) 

वहाँ वास्तविक डेटा में तार में विरलता की काफी एक बहुत कुछ है। मैं एस 1 और एस 2 (एक प्रति सबप्लॉट) के लिए d.hist() (उदाहरण के लिए subplots के साथ) द्वारा उत्पन्न किए गए स्ट्रिंग की घटना के हिस्टोग्राम बनाना चाहता हूं।

/Library/Python/2.7/site-packages/pandas/tools/plotting.pyc in hist_frame(data, column, by, grid, xlabelsize, xrot, ylabelsize, yrot, ax, sharex, sharey, **kwds) 
    1725   ax.xaxis.set_visible(True) 
    1726   ax.yaxis.set_visible(True) 
-> 1727   ax.hist(data[col].dropna().values, **kwds) 
    1728   ax.set_title(col) 
    1729   ax.grid(grid) 

/Library/Python/2.7/site-packages/matplotlib/axes.pyc in hist(self, x, bins, range, normed, weights, cumulative, bottom, histtype, align, orientation, rwidth, log, color, label, stacked, **kwargs) 
    8099    # this will automatically overwrite bins, 
    8100    # so that each histogram uses the same bins 
-> 8101    m, bins = np.histogram(x[i], bins, weights=w[i], **hist_kwargs) 
    8102    if mlast is None: 
    8103     mlast = np.zeros(len(bins)-1, m.dtype) 

/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy/lib/function_base.pyc in histogram(a, bins, range, normed, weights, density) 
    167    else: 
    168     range = (a.min(), a.max()) 
--> 169   mn, mx = [mi+0.0 for mi in range] 
    170   if mn == mx: 
    171    mn -= 0.5 

TypeError: cannot concatenate 'str' and 'float' objects 

मुझे लगता है मैं मैन्युअल रूप से प्रत्येक श्रृंखला के माध्यम से जा सकते हैं, एक value_counts() करते हैं, तो एक बार साजिश के रूप में यह साजिश, और मैन्युअल रूप से subplots बनाएँ:

बस d.hist कर() इस त्रुटि देता है। मैं जांचना चाहता था कि कोई आसान तरीका है या नहीं।

उत्तर

1

मैं श्रृंखला को collections.Counter (documentation) में फेंक दूंगा (आपको इसे पहले सूची में परिवर्तित करने की आवश्यकता हो सकती है)। मैं pandas विशेषज्ञ नहीं हूं, लेकिन मुझे लगता है कि आप Counter ऑब्जेक्ट को Series में स्ट्रिंग द्वारा अनुक्रमित करने में सक्षम होना चाहिए, और अपने प्लॉट बनाने के लिए इसका उपयोग करना चाहिए।

यह काम नहीं कर रहा है क्योंकि यह (सही ढंग से) त्रुटियों को उठा रहा है जब यह अनुमान लगाने की कोशिश करता है कि बिन किनारों को कहाँ होना चाहिए, जो स्ट्रिंग के साथ कोई समझ नहीं आता है।

+0

एजी, मुझे इसे हराया! हाँ, काउंटर नौकरी के लिए उपकरण है! –

+1

प्रतिक्रिया के लिए धन्यवाद। value_counts एक ही चीज़ करता है, और एक श्रृंखला है -> श्रृंखला परिवर्तन (इसलिए इसे श्रृंखला में वापस मजबूर करने की आवश्यकता नहीं है)। मुझे लगता है कि मैं सोच रहा था कि क्या यह गिनती करने के लिए कुछ विकल्प था और तारों के इस विशिष्ट मामले के लिए स्वचालित रूप से मेरे लिए साजिश रुक रही थी, क्योंकि चींटियों में से एक है। – amatsukawa

6

आप (यह भी एक श्रृंखला विधि value_counts है) pd.value_counts उपयोग कर सकते हैं:

In [20]: d.apply(pd.value_counts) 
Out[20]: 
    s1 s2 
a 3 3 
b 2 NaN 
c 1 NaN 
d NaN 1 
f NaN 3 

और की तुलना में जिसके परिणामस्वरूप DataFrame साजिश।

19

dataframe पुनः:

import pandas as pd 
s1 = pd.Series(['a', 'b', 'a', 'c', 'a', 'b']) 
s2 = pd.Series(['a', 'f', 'a', 'd', 'a', 'f', 'f']) 
d = pd.DataFrame({'s1': s1, 's2': s2}) 

subplots साथ हिस्टोग्राम प्राप्त करने के लिए के रूप में वांछित:

d.apply(pd.value_counts).plot(kind='bar', subplots=True) 

enter image description here

ओपी प्रश्न में pd.value_counts उल्लेख किया है। मुझे लगता है कि गायब टुकड़ा सिर्फ वांछित बार साजिश बनाने के लिए "मैन्युअल" बनाने का कोई कारण नहीं है।

d.apply(pd.value_counts) से आउटपुट एक पांडा डेटाफ्रेम है। हम किसी भी अन्य डेटाफ्रेम जैसे मूल्यों को साजिश कर सकते हैं, और subplots=True विकल्प चुनने से हमें वह चाहिए जो हम चाहते हैं।

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