Pandas计算每个范围之间的值的数量

时间:2016-01-27 20:42:49

标签: python pandas

我想查找某些自定义范围之间的数据计数。

说我有一些数据:

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

def main():
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    sys.exit(app.exec_())

class MyWindow(QWidget):
    def __init__(self, *args):
        QWidget.__init__(self, *args)

        self.la = QLabel("Press tab in this box:")
        self.le = MyLineEdit()

        layout = QVBoxLayout()
        layout.addWidget(self.la)
        layout.addWidget(self.le)
        self.setLayout(layout)

        self.le.keyPressed.connect(self.update)

    def update(self, text):
        self.le.setText(text)

MOD_MASK = (Qt.CTRL | Qt.ALT | Qt.SHIFT | Qt.META)

class MyLineEdit(QLineEdit):
    keyPressed = pyqtSignal(str)

    def keyPressEvent(self, event):
        keyname = ''
        key = event.key()
        modifiers = int(event.modifiers())
        if (modifiers and modifiers & MOD_MASK == modifiers and
            key > 0 and key != Qt.Key_Shift and key != Qt.Key_Alt and
            key != Qt.Key_Control and key != Qt.Key_Meta):

            keyname = QKeySequence(modifiers + key).toString()

            print('event.text(): %r' % event.text())
            print('event.key(): %d, %#x, %s' % (key, key, keyname))

        self.keyPressed.emit(keyname)

if __name__ == "__main__":
    main()

如何生成显示不同范围之间的值数量的数据框?例如,假设我想看看在0-19,20-39,40-59,60-79,80-100之间出现了多少个值。输出数据框将有一列具有这些范围,另一列具有计数。

我可以想到一些丑陋的方法,包括使用.apply获取一个新的列列表,说明它们之间的值(然后做一个groupby),但我怀疑pandas有一种更清洁的方式潜伏着。

4 个答案:

答案 0 :(得分:7)

Per Jarad与其他问题的链接:

test.groupby(pd.cut(test['x'], np.arange(0,100,20))).count()

答案 1 :(得分:2)

这可能是更好的方式。我自己只是熊猫新手,但目前情况如何:

test.query(test.x.isin(range(20)))

答案 2 :(得分:1)

pandas和numpy允许布尔索引, 这是一种丑陋的方法吗?

ranges = [ (0,19), (20, 39), (40, 69) ...]
cnt = []
for range in ranges:
    tmp = ranges[(ranges['x'] > range[0]) & (range['x'] <= range[1]) ]
    cnt.append( len(tmp) )

答案 3 :(得分:-1)

您可以使用numpy.histrogram功能。

import numpy as np
series = [0, 20, 40, ...]
count, bin_edge = np.histogram( bins = series )

根据numpy.histogram,如果bins是一个序列,它定义了bin边,包括最右边,允许不均匀的bin宽度。