# -*- coding: utf-8 -*-
from copy import copy, deepcopy
import pytest
from pandas import MultiIndex
import pandas.util.testing as tm
def assert_multiindex_copied(copy, original):
# Levels should be (at least, shallow copied)
tm.assert_copy(copy.levels, original.levels)
tm.assert_almost_equal(copy.codes, original.codes)
# Labels doesn't matter which way copied
tm.assert_almost_equal(copy.codes, original.codes)
assert copy.codes is not original.codes
# Names doesn't matter which way copied
assert copy.names == original.names
assert copy.names is not original.names
# Sort order should be copied
assert copy.sortorder == original.sortorder
def test_copy(idx):
i_copy = idx.copy()
assert_multiindex_copied(i_copy, idx)
def test_shallow_copy(idx):
i_copy = idx._shallow_copy()
assert_multiindex_copied(i_copy, idx)
def test_labels_deprecated(idx):
# GH23752
with tm.assert_produces_warning(FutureWarning):
idx.copy(labels=idx.codes)
def test_view(idx):
i_view = idx.view()
assert_multiindex_copied(i_view, idx)
@pytest.mark.parametrize('func', [copy, deepcopy])
def test_copy_and_deepcopy(func):
idx = MultiIndex(
levels=[['foo', 'bar'], ['fizz', 'buzz']],
codes=[[0, 0, 0, 1], [0, 0, 1, 1]],
names=['first', 'second']
)
idx_copy = func(idx)
assert idx_copy is not idx
assert idx_copy.equals(idx)
@pytest.mark.parametrize('deep', [True, False])
def test_copy_method(deep):
idx = MultiIndex(
levels=[['foo', 'bar'], ['fizz', 'buzz']],
codes=[[0, 0, 0, 1], [0, 0, 1, 1]],
names=['first', 'second']
)
idx_copy = idx.copy(deep=deep)
assert idx_copy.equals(idx)
@pytest.mark.parametrize('deep', [True, False])
@pytest.mark.parametrize('kwarg, value', [
('names', ['thrid', 'fourth']),
('levels', [['foo2', 'bar2'], ['fizz2', 'buzz2']]),
('codes', [[1, 0, 0, 0], [1, 1, 0, 0]])
])
def test_copy_method_kwargs(deep, kwarg, value):
# gh-12309: Check that the "name" argument as well other kwargs are honored
idx = MultiIndex(
levels=[['foo', 'bar'], ['fizz', 'buzz']],
codes=[[0, 0, 0, 1], [0, 0, 1, 1]],
names=['first', 'second']
)
return
idx_copy = idx.copy(**{kwarg: value, 'deep': deep})
if kwarg == 'names':
assert getattr(idx_copy, kwarg) == value
else:
assert [list(i) for i in getattr(idx_copy, kwarg)] == value