113 lines
3.3 KiB
Python
113 lines
3.3 KiB
Python
|
import numpy as np
|
||
|
import pytest
|
||
|
|
||
|
import pandas as pd
|
||
|
from pandas import MultiIndex
|
||
|
import pandas._testing as tm
|
||
|
|
||
|
|
||
|
def test_fillna(idx):
|
||
|
# GH 11343
|
||
|
msg = "isna is not defined for MultiIndex"
|
||
|
with pytest.raises(NotImplementedError, match=msg):
|
||
|
idx.fillna(idx[0])
|
||
|
|
||
|
|
||
|
def test_dropna():
|
||
|
# GH 6194
|
||
|
idx = MultiIndex.from_arrays(
|
||
|
[
|
||
|
[1, np.nan, 3, np.nan, 5],
|
||
|
[1, 2, np.nan, np.nan, 5],
|
||
|
["a", "b", "c", np.nan, "e"],
|
||
|
]
|
||
|
)
|
||
|
|
||
|
exp = MultiIndex.from_arrays([[1, 5], [1, 5], ["a", "e"]])
|
||
|
tm.assert_index_equal(idx.dropna(), exp)
|
||
|
tm.assert_index_equal(idx.dropna(how="any"), exp)
|
||
|
|
||
|
exp = MultiIndex.from_arrays(
|
||
|
[[1, np.nan, 3, 5], [1, 2, np.nan, 5], ["a", "b", "c", "e"]]
|
||
|
)
|
||
|
tm.assert_index_equal(idx.dropna(how="all"), exp)
|
||
|
|
||
|
msg = "invalid how option: xxx"
|
||
|
with pytest.raises(ValueError, match=msg):
|
||
|
idx.dropna(how="xxx")
|
||
|
|
||
|
# GH26408
|
||
|
# test if missing values are dropped for multiindex constructed
|
||
|
# from codes and values
|
||
|
idx = MultiIndex(
|
||
|
levels=[[np.nan, None, pd.NaT, "128", 2], [np.nan, None, pd.NaT, "128", 2]],
|
||
|
codes=[[0, -1, 1, 2, 3, 4], [0, -1, 3, 3, 3, 4]],
|
||
|
)
|
||
|
expected = MultiIndex.from_arrays([["128", 2], ["128", 2]])
|
||
|
tm.assert_index_equal(idx.dropna(), expected)
|
||
|
tm.assert_index_equal(idx.dropna(how="any"), expected)
|
||
|
|
||
|
expected = MultiIndex.from_arrays(
|
||
|
[[np.nan, np.nan, "128", 2], ["128", "128", "128", 2]]
|
||
|
)
|
||
|
tm.assert_index_equal(idx.dropna(how="all"), expected)
|
||
|
|
||
|
|
||
|
def test_nulls(idx):
|
||
|
# this is really a smoke test for the methods
|
||
|
# as these are adequately tested for function elsewhere
|
||
|
|
||
|
msg = "isna is not defined for MultiIndex"
|
||
|
with pytest.raises(NotImplementedError, match=msg):
|
||
|
idx.isna()
|
||
|
|
||
|
|
||
|
@pytest.mark.xfail(reason="isna is not defined for MultiIndex")
|
||
|
def test_hasnans_isnans(idx):
|
||
|
# GH 11343, added tests for hasnans / isnans
|
||
|
index = idx.copy()
|
||
|
|
||
|
# cases in indices doesn't include NaN
|
||
|
expected = np.array([False] * len(index), dtype=bool)
|
||
|
tm.assert_numpy_array_equal(index._isnan, expected)
|
||
|
assert index.hasnans is False
|
||
|
|
||
|
index = idx.copy()
|
||
|
values = index.values
|
||
|
values[1] = np.nan
|
||
|
|
||
|
index = type(idx)(values)
|
||
|
|
||
|
expected = np.array([False] * len(index), dtype=bool)
|
||
|
expected[1] = True
|
||
|
tm.assert_numpy_array_equal(index._isnan, expected)
|
||
|
assert index.hasnans is True
|
||
|
|
||
|
|
||
|
def test_nan_stays_float():
|
||
|
|
||
|
# GH 7031
|
||
|
idx0 = MultiIndex(levels=[["A", "B"], []], codes=[[1, 0], [-1, -1]], names=[0, 1])
|
||
|
idx1 = MultiIndex(levels=[["C"], ["D"]], codes=[[0], [0]], names=[0, 1])
|
||
|
idxm = idx0.join(idx1, how="outer")
|
||
|
assert pd.isna(idx0.get_level_values(1)).all()
|
||
|
# the following failed in 0.14.1
|
||
|
assert pd.isna(idxm.get_level_values(1)[:-1]).all()
|
||
|
|
||
|
df0 = pd.DataFrame([[1, 2]], index=idx0)
|
||
|
df1 = pd.DataFrame([[3, 4]], index=idx1)
|
||
|
dfm = df0 - df1
|
||
|
assert pd.isna(df0.index.get_level_values(1)).all()
|
||
|
# the following failed in 0.14.1
|
||
|
assert pd.isna(dfm.index.get_level_values(1)[:-1]).all()
|
||
|
|
||
|
|
||
|
def test_tuples_have_na():
|
||
|
index = MultiIndex(
|
||
|
levels=[[1, 0], [0, 1, 2, 3]],
|
||
|
codes=[[1, 1, 1, 1, -1, 0, 0, 0], [0, 1, 2, 3, 0, 1, 2, 3]],
|
||
|
)
|
||
|
|
||
|
assert pd.isna(index[4][0])
|
||
|
assert pd.isna(index.values[4][0])
|