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
là ['(0, 0.2]', '(0, 0.2]']
nhưng mục nhập đầu tiên trong allkeys
là ['(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.
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) '. –
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. –
Đó 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