5
我想爲給定的2d數據集製作2d直方圖(或其他統計數據,但讓我們以直方圖爲例)。問題是空箱看起來完全被丟棄。例如,pandas groupby報告空箱
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很好,但在更復雜的設置(n維binning,或計算統計以外的統計等),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()
。
任何幫助,非常感謝。
看起來像'.size()'忽略遺漏值。解決方法是使用'count()',在這種情況下應用於'binned' groupby對象時,似乎保留缺失的值:'binned.count()['x']。unstack()。fillna(0 )'。 –
似乎這個行爲可能在'pandas'' v0.16'(可在我的工作計算機中)後發生改變。如果我運行'binned.count()'我得到'ValueError:無法將NA轉換爲整數'。然而,在我的筆記本電腦中(使用'v0.17.1')'count()'可以正常工作。 –
這是一個猜測,但如果你做'binned.agg(lambda x:1.0 * x.count())。unstack()'會發生什麼?它應該返回花車,所以希望nan不會被轉換。 – ptrj