python - Pandas groupby 报告空垃圾箱

标签 python pandas

我想制作给定二维数据集的二维直方图(或其他统计数据,但我们以直方图为例)。问题是空垃圾箱似乎完全被丢弃了。例如,

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]'] , 所以我无法匹配 allkeysbinned.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/

相关文章:

python - 如何在 re.sub 上迭代列表并使用 python 替换字符串中的变量?

python - 在 Python 中从请求中提取 IP

python - 获取某行的平均值

执行之间的python多处理 sleep

python - Scrapy 没有给出任何输出

python - 使用 pandas.read_csv 时忽略多余的逗号

python-3.x - 在 Python 中连接 MultiIndex 数据帧

python - 如何控制matplotlib中图形线条的颜色?

python - 从数据框中删除多列

python - 如何使用两个单独的数据框在 Pandas 中执行 SumProduct()