我想制作给定二维数据集的二维直方图(或其他统计数据,但我们以直方图为例)。问题是空垃圾箱似乎完全被丢弃了。例如,
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.]]
但是,对于 Pandas ,
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()
.
非常感谢任何帮助。
最佳答案
看起来 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
关于python - Pandas groupby 报告空垃圾箱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37092988/