我想制作给定2d数据集的2d直方图(或其他统计数据,但让我们采用该示例的直方图)。问题是空箱似乎完全被丢弃了。例如,
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维分箱,或计算除计数之外的统计等)上,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()
匹配。
非常感谢任何帮助。
答案 0 :(得分:1)
pd.cut
似乎保留了您的分箱信息,这意味着我们可以在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