|
7 | 7 | from pandas import compat |
8 | 8 | import numpy as np |
9 | 9 |
|
| 10 | +from sys import getsizeof |
10 | 11 | import pandas.tslib as tslib |
11 | 12 | import pandas.lib as lib |
12 | 13 | import pandas.algos as _algos |
|
17 | 18 | from pandas.core.common import isnull, array_equivalent |
18 | 19 | import pandas.core.common as com |
19 | 20 | from pandas.core.common import (_values_from_object, is_float, is_integer, |
20 | | - ABCSeries, _ensure_object) |
| 21 | + ABCSeries, _ensure_object, _ensure_int64) |
21 | 22 | from pandas.core.config import get_option |
22 | 23 |
|
23 | 24 | # simplify |
@@ -2680,13 +2681,13 @@ def _set_labels(self, labels, level=None, copy=False, validate=True, |
2680 | 2681 | raise ValueError('Length of labels must match length of levels.') |
2681 | 2682 |
|
2682 | 2683 | if level is None: |
2683 | | - new_labels = FrozenList(_ensure_frozen(v, copy=copy)._shallow_copy() |
2684 | | - for v in labels) |
| 2684 | + new_labels = FrozenList(_ensure_frozen(lab, lev, copy=copy)._shallow_copy() |
| 2685 | + for lev, lab in zip(self.levels, labels)) |
2685 | 2686 | else: |
2686 | 2687 | level = [self._get_level_number(l) for l in level] |
2687 | 2688 | new_labels = list(self._labels) |
2688 | | - for l, v in zip(level, labels): |
2689 | | - new_labels[l] = _ensure_frozen(v, copy=copy)._shallow_copy() |
| 2689 | + for l, lev, lab in zip(level, self.levels, labels): |
| 2690 | + new_labels[l] = _ensure_frozen(lab, lev, copy=copy)._shallow_copy() |
2690 | 2691 | new_labels = FrozenList(new_labels) |
2691 | 2692 |
|
2692 | 2693 | self._labels = new_labels |
@@ -2824,6 +2825,14 @@ def _array_values(self): |
2824 | 2825 | def dtype(self): |
2825 | 2826 | return np.dtype('O') |
2826 | 2827 |
|
| 2828 | + @cache_readonly |
| 2829 | + def nbytes(self): |
| 2830 | + """ return the number of bytes in the underlying data """ |
| 2831 | + level_nbytes = sum(( i.nbytes for i in self.levels )) |
| 2832 | + label_nbytes = sum(( i.nbytes for i in self.labels )) |
| 2833 | + names_nbytes = sum(( getsizeof(i) for i in self.names )) |
| 2834 | + return level_nbytes + label_nbytes + names_nbytes |
| 2835 | + |
2827 | 2836 | def __repr__(self): |
2828 | 2837 | encoding = get_option('display.encoding') |
2829 | 2838 | attrs = [('levels', default_pprint(self.levels)), |
@@ -4361,7 +4370,7 @@ def insert(self, loc, item): |
4361 | 4370 | lev_loc = level.get_loc(k) |
4362 | 4371 |
|
4363 | 4372 | new_levels.append(level) |
4364 | | - new_labels.append(np.insert(labels, loc, lev_loc)) |
| 4373 | + new_labels.append(np.insert(_ensure_int64(labels), loc, lev_loc)) |
4365 | 4374 |
|
4366 | 4375 | return MultiIndex(levels=new_levels, labels=new_labels, |
4367 | 4376 | names=self.names, verify_integrity=False) |
@@ -4474,8 +4483,8 @@ def _ensure_index(index_like, copy=False): |
4474 | 4483 | return Index(index_like) |
4475 | 4484 |
|
4476 | 4485 |
|
4477 | | -def _ensure_frozen(array_like, copy=False): |
4478 | | - array_like = np.asanyarray(array_like, dtype=np.int_) |
| 4486 | +def _ensure_frozen(array_like, categories, copy=False): |
| 4487 | + array_like = com._coerce_indexer_dtype(array_like, categories) |
4479 | 4488 | array_like = array_like.view(FrozenNDArray) |
4480 | 4489 | if copy: |
4481 | 4490 | array_like = array_like.copy() |
|
0 commit comments