[英]pandas groupby report empty bins
我想制作给定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.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]']
binned
['(0, 0.2]', '(0, 0.2]']
但是第一个条目在allkeys
是['(0.0, 0.2]', '(0.0, 0.2]']
allkeys
['(0.0, 0.2]', '(0.0, 0.2]']
allkeys
['(0.0, 0.2]', '(0.0, 0.2]']
,所以我无法将allkeys
与binned.viewkeys()
匹配。
任何帮助深表感谢。
看来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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.