def _column_pack_filter(self, next_filter):
        """ Top-align column data irrespective of original row alignment.  E.g.
            INPUT: [
                ["1a", "2a"],
                [None, "2b"],
                ["1b", "2c"],
                [None, "2d"]
            ]
            OUTPUT: [
                ["1a", "2a"],
                ["1b", "2b"],
                [<blank>, "2c"],
                [<blank>, "2d"]
            ]
        """
        next(next_filter)
        col_count = len(self.widths)
        queues = [collections.deque() for _ in range(col_count)]
        while True:
            try:
                row = (yield)
            except GeneratorExit:
                break
            for col, queue in zip(row, queues):
                if col is not None:
                    queue.append(col)
            if all(queues):
                next_filter.send([x.popleft() for x in queues])
        blanks = list(map(self._get_blank_cell, range(col_count)))
        while any(queues):
            next_filter.send([q.popleft() if q else blank
                              for q, blank in zip(queues, blanks)])
Top-align column data irrespective of original row alignment.  E.g.
            INPUT: [
                ["1a", "2a"],
                [None, "2b"],
                ["1b", "2c"],
                [None, "2d"]
            ]
            OUTPUT: [
                ["1a", "2a"],
                ["1b", "2b"],
                [<blank>, "2c"],
                [<blank>, "2d"]
            ]