繁体   English   中英

pandas groupby报告空箱

[英]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.histogram2dnumpy.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]'] ,所以我无法将allkeysbinned.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM