pandas groupby报告空箱

时间:2016-05-07 19:48:01

标签: python pandas

我想制作给定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]'],因此我无法将allkeysbinned.viewkeys()匹配。

非常感谢任何帮助。

1 个答案:

答案 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