|
2 | 2 | # pylint: disable=W0703,W0622,W0613,W0201
|
3 | 3 | from pandas.compat import range, zip
|
4 | 4 | from pandas import compat
|
| 5 | +from functools import partial |
5 | 6 | import itertools
|
6 | 7 | import re
|
7 | 8 |
|
@@ -466,48 +467,12 @@ def unstack(obj, level, fill_value=None):
|
466 | 467 |
|
467 | 468 |
|
468 | 469 | def _unstack_frame(obj, level, fill_value=None):
|
469 |
| - from pandas.core.internals import BlockManager, make_block as _make_block |
470 |
| - |
471 | 470 | if obj._is_mixed_type:
|
472 |
| - unstacker = _Unstacker(np.empty((0, 0)), # dummy |
473 |
| - obj.index, level=level, |
474 |
| - value_columns=obj.columns) |
475 |
| - new_columns = unstacker.get_new_columns() |
476 |
| - new_index = unstacker.get_new_index() |
477 |
| - new_axes = [new_columns, new_index] |
478 |
| - |
479 |
| - new_blocks = [] |
480 |
| - mask_blocks = np.zeros_like(new_columns, dtype=bool) |
481 |
| - for blk in obj._data.blocks: |
482 |
| - blk_items = obj._data.items[blk.mgr_locs.indexer] |
483 |
| - bunstacker = _Unstacker(blk.values.T, obj.index, level=level, |
484 |
| - value_columns=blk_items, |
485 |
| - fill_value=fill_value) |
486 |
| - new_items = bunstacker.get_new_columns() |
487 |
| - new_placement = new_columns.get_indexer(new_items) |
488 |
| - new_values, mask = bunstacker.get_new_values() |
489 |
| - |
490 |
| - mask_blocks[new_placement] = mask.any(0) |
491 |
| - |
492 |
| - # BlockManager can't handle SparseBlocks with multiple items, |
493 |
| - # so lets make one block for each item |
494 |
| - if is_sparse(blk.values): |
495 |
| - new_placement = [[i] for i in new_placement] |
496 |
| - new_values = new_values.T |
497 |
| - make_block = blk.make_block_same_class |
498 |
| - else: |
499 |
| - new_placement = [new_placement] |
500 |
| - new_values = [new_values.T] |
501 |
| - make_block = _make_block |
502 |
| - |
503 |
| - for cols, placement in zip(new_values, new_placement): |
504 |
| - newb = make_block(cols, placement=placement) |
505 |
| - new_blocks.append(newb) |
506 |
| - |
| 471 | + unstacker = partial(_Unstacker, index=obj.index, |
| 472 | + level=level, fill_value=fill_value) |
| 473 | + blocks = obj._data.unstack(unstacker) |
507 | 474 | klass = type(obj)
|
508 |
| - assert klass in (SparseDataFrame, DataFrame), klass |
509 |
| - result = klass(BlockManager(new_blocks, new_axes)) |
510 |
| - return result.loc[:, mask_blocks] |
| 475 | + return klass(blocks) |
511 | 476 | else:
|
512 | 477 | unstacker = _Unstacker(obj.values, obj.index, level=level,
|
513 | 478 | value_columns=obj.columns,
|
|
0 commit comments