2016-05-07 23 views
5

Tôi muốn tạo biểu đồ 2d (hoặc các thống kê khác, nhưng hãy lấy một biểu đồ cho ví dụ) của tập dữ liệu 2d đã cho. Vấn đề là các thùng rỗng dường như bị loại bỏ hoàn toàn. Ví dụ,nhóm gấu trúc báo cáo thùng trống

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) 

tôi có thể dễ dàng có được kết quả mong muốn với

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

cho

[[ 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.]] 

Tuy nhiên, với gấu trúc,

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() 

in

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 

tức là hàng cuối cùng, với 1 < x <= 1.2, bị thiếu hoàn toàn vì không có giá trị trong đó. Tuy nhiên tôi muốn thấy rõ ràng (như khi sử dụng numpy.histogram2d). Trong ví dụ này, tôi có thể sử dụng numpy tốt nhưng trên các thiết lập phức tạp hơn (n-chiều binning, hoặc tính toán thống kê khác hơn đếm, vv), pandas có thể hiệu quả hơn để mã và tính toán hơn numpy.

Về nguyên tắc tôi có thể đưa ra cách để kiểm tra xem một số có mặt, sử dụng một cái gì đó giống như

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))] 

Tuy nhiên, vấn đề là định dạng chỉ số là không phù hợp, theo nghĩa là, như bạn xem ở trên, chỉ số đầu tiên của binned['(0, 0.2]', '(0, 0.2]'] nhưng mục nhập đầu tiên trong allkeys['(0.0, 0.2]', '(0.0, 0.2]'], vì vậy, tôi không thể đối sánh allkeys với binned.viewkeys().

Bất kỳ giúp đỡ được nhiều đánh giá cao.

+1

Trông như '.size()' bỏ qua các giá trị thiếu. Cách giải quyết có thể là sử dụng 'count()' xuất hiện để giữ các giá trị bị thiếu khi được áp dụng cho đối tượng group 'binned' trong trường hợp này:' binned.count() ['x']. Unstack(). Fillna (0) '. –

+1

Có vẻ như hành vi có thể đã thay đổi sau 'pandas'' v0.16' (có sẵn trong máy tính của tôi). Nếu tôi chạy 'binned.count()' tôi nhận 'ValueError: Không thể chuyển đổi NA thành số nguyên'. Tuy nhiên trong máy tính xách tay của tôi (với 'v0.17.1')' count() 'hoạt động tốt. –

+2

Đó là một dự đoán, nhưng điều gì sẽ xảy ra nếu bạn làm 'binned.agg (lambda x: 1.0 * x.count()). Unstack()'? Nó sẽ trở lại nổi, vì vậy hy vọng, nan sẽ không được chuyển đổi. – ptrj

Trả lời

0

Dường như pd.cut giữ thông tin của bạn di chuyển chuột có nghĩa là chúng ta có thể sử dụng nó trong một 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 
Các vấn đề liên quan