2016-05-07 17 views
5

मैं एक 2 डी हिस्टोग्राम (या अन्य आंकड़े, लेकिन उदाहरण के लिए हिस्टोग्राम लेना चाहता हूं) एक 2 डी डेटा सेट के लिए बनाना चाहता हूं। समस्या यह है कि खाली डिब्बे पूरी तरह से त्याग दिया प्रतीत होता है। उदाहरण के लिए,पांडा समूह समूह की रिपोर्ट खाली डिब्बे

import numpy 
import pandas 

numpy.random.seed(35) 
values = numpy.random.random((2,10000)) 

xbins = numpy.linspace(0, 1.2, 7) 
ybins = numpy.linspace(0, 1, 6) 

मैं आसानी से वांछित आउटपुट

print numpy.histogram2d(values[0], values[1], (xbins,ybins)) 

[[ 408. 373. 405. 411. 400.] 
[ 390. 413. 400. 414. 368.] 
[ 354. 414. 421. 400. 413.] 
[ 426. 393. 407. 416. 412.] 
[ 412. 397. 396. 356. 401.] 
[ 0. 0. 0. 0. 0.]] 

दे रही है हालांकि, पांडा के साथ साथ प्राप्त कर सकते हैं,

df = pandas.DataFrame({'x': values[0], 'y': values[1]}) 
binned = df.groupby([pandas.cut(df['x'], xbins), 
        pandas.cut(df['y'], ybins)]) 
print binned.size().unstack() 

प्रिंट

y   (0, 0.2] (0.2, 0.4] (0.4, 0.6] (0.6, 0.8] (0.8, 1] 
x                 
(0, 0.2]   408   373   405   411  400 
(0.2, 0.4]  390   413   400   414  368 
(0.4, 0.6]  354   414   421   400  413 
(0.6, 0.8]  426   393   407   416  412 
(0.8, 1]   412   397   396   356  401 

यानी, 1 < x <= 1.2 के साथ अंतिम पंक्ति, पूरी तरह गायब है, क्योंकि इसमें कोई मूल्य नहीं है। हालांकि मैं इसे स्पष्ट रूप से देखना चाहता हूं (जैसे numpy.histogram2d का उपयोग करते समय)। इस उदाहरण में मैं numpy का उपयोग ठीक कर सकता हूं लेकिन अधिक जटिल सेटिंग्स (एन-आयामी कताई, या गणना के अलावा अन्य आंकड़ों की गणना आदि) पर, pandas कोड के लिए और अधिक कुशल हो सकता है और numpy से गणना करने के लिए।

सिद्धांत रूप में मैं तरीके अगर एक सूचकांक मौजूद है की जाँच करने के साथ की तरह

allkeys = [('({0}, {1}]'.format(xbins[i-1], xbins[i]), 
      '({0}, {1}]'.format(ybins[j-1], ybins[j])) 
      for j in xrange(1, len(ybins)) 
      for i in xrange(1, len(xbins))] 

आ सकता है, कुछ का उपयोग कर हालांकि, समस्या यह है कि सूचकांक स्वरूपण, संगत नहीं है अर्थ में है कि, आप के रूप में ऊपर देखें, binned की पहली अनुक्रमणिका ['(0, 0.2]', '(0, 0.2]'] है लेकिन allkeys में पहली प्रविष्टि ['(0.0, 0.2]', '(0.0, 0.2]'] है, इसलिए मैं allkeys से binned.viewkeys() से मेल नहीं खा सकता।

किसी भी मदद की बहुत सराहना की जाती है।

+1

'.size तरह लग रहा है()' लापता मूल्यों पर ध्यान नहीं देता। 'गिनती') का उपयोग करने के लिए एक कामकाज हो सकता है जो इस मामले में 'binned' groupby ऑब्जेक्ट पर लागू होने पर अनुपलब्ध मानों को रखने के लिए प्रतीत होता है: 'binned.count() [' x ']। Unstack()। Fillna (0) '। –

+1

ऐसा लगता है कि व्यवहार 'पांडा' 'v0.16' (मेरे काम कंप्यूटर में उपलब्ध) के बाद बदल सकता है। यदि मैं 'binned.count() चलाता हूं, तो मुझे' ValueError मिलता है: NA को पूर्णांक में परिवर्तित नहीं किया जा सकता है। हालांकि मेरे लैपटॉप में ('v0.17.1' के साथ) 'गिनती()' ठीक काम करता है। –

+2

यह अनुमान है, लेकिन यदि आप 'binned.agg (lambda x: 1.0 * x.count()) करते हैं तो क्या होता है। Unstack()'? इसे फ्लोट वापस करना चाहिए, इसलिए उम्मीद है कि नैन को परिवर्तित नहीं किया जाएगा। – ptrj

उत्तर

0

ऐसा लगता है कि pd.cut अपने binning जानकारी जिसका मतलब है कि हम एक reindex में उपयोग कर सकते हैं रहता है:

In [79]: xcut = pd.cut(df['x'], xbins) 

In [80]: ycut = pd.cut(df['y'], ybins) 

In [81]: binned = df.groupby([xcut, ycut]) 

In [82]: sizes = binned.size() 

In [85]: (sizes.reindex(pd.MultiIndex.from_product([xcut.cat.categories, ycut.cat.categories])) 
    ...:  .unstack() 
    ...:  .fillna(0.0)) 
    ...: 
Out[85]: 
      (0.0, 0.2] (0.2, 0.4] (0.4, 0.6] (0.6, 0.8] (0.8, 1.0] 
(0.0, 0.2]  408.0  373.0  405.0  411.0  400.0 
(0.2, 0.4]  390.0  413.0  400.0  414.0  368.0 
(0.4, 0.6]  354.0  414.0  421.0  400.0  413.0 
(0.6, 0.8]  426.0  393.0  407.0  416.0  412.0 
(0.8, 1.0]  412.0  397.0  396.0  356.0  401.0 
(1.0, 1.2]   0.0   0.0   0.0   0.0   0.0 
संबंधित मुद्दे