5
from pandas import DataFrame, MultiIndex
6
import pandas._testing as tm
9
def test_to_numpy(idx):
10
result = idx.to_numpy()
12
tm.assert_numpy_array_equal(result, exp)
16
tuples = [(1, "one"), (1, "two"), (2, "one"), (2, "two")]
18
index = MultiIndex.from_tuples(tuples)
19
result = index.to_frame(index=False)
20
expected = DataFrame(tuples)
21
tm.assert_frame_equal(result, expected)
23
result = index.to_frame()
24
expected.index = index
25
tm.assert_frame_equal(result, expected)
27
tuples = [(1, "one"), (1, "two"), (2, "one"), (2, "two")]
28
index = MultiIndex.from_tuples(tuples, names=["first", "second"])
29
result = index.to_frame(index=False)
30
expected = DataFrame(tuples)
31
expected.columns = ["first", "second"]
32
tm.assert_frame_equal(result, expected)
34
result = index.to_frame()
35
expected.index = index
36
tm.assert_frame_equal(result, expected)
39
index = MultiIndex.from_tuples(tuples)
40
result = index.to_frame(index=False, name=["first", "second"])
41
expected = DataFrame(tuples)
42
expected.columns = ["first", "second"]
43
tm.assert_frame_equal(result, expected)
45
result = index.to_frame(name=["first", "second"])
46
expected.index = index
47
expected.columns = ["first", "second"]
48
tm.assert_frame_equal(result, expected)
50
msg = "'name' must be a list / sequence of column names."
51
with pytest.raises(TypeError, match=msg):
52
index.to_frame(name="first")
54
msg = "'name' should have same length as number of levels on index."
55
with pytest.raises(ValueError, match=msg):
56
index.to_frame(name=["first"])
58
# Tests for datetime index
59
index = MultiIndex.from_product([range(5), pd.date_range("20130101", periods=3)])
60
result = index.to_frame(index=False)
63
0: np.repeat(np.arange(5, dtype="int64"), 3),
64
1: np.tile(pd.date_range("20130101", periods=3), 5),
67
tm.assert_frame_equal(result, expected)
69
result = index.to_frame()
70
expected.index = index
71
tm.assert_frame_equal(result, expected)
74
result = index.to_frame(index=False, name=["first", "second"])
77
"first": np.repeat(np.arange(5, dtype="int64"), 3),
78
"second": np.tile(pd.date_range("20130101", periods=3), 5),
81
tm.assert_frame_equal(result, expected)
83
result = index.to_frame(name=["first", "second"])
84
expected.index = index
85
tm.assert_frame_equal(result, expected)
88
def test_to_frame_dtype_fidelity():
90
mi = pd.MultiIndex.from_arrays(
92
pd.date_range("19910905", periods=6, tz="US/Eastern"),
94
pd.Categorical(["a", "a", "b", "b", "c", "c"], ordered=True),
95
["x", "x", "y", "z", "x", "y"],
97
names=["dates", "a", "b", "c"],
99
original_dtypes = {name: mi.levels[i].dtype for i, name in enumerate(mi.names)}
101
expected_df = pd.DataFrame(
103
"dates": pd.date_range("19910905", periods=6, tz="US/Eastern"),
104
"a": [1, 1, 1, 2, 2, 2],
105
"b": pd.Categorical(["a", "a", "b", "b", "c", "c"], ordered=True),
106
"c": ["x", "x", "y", "z", "x", "y"],
109
df = mi.to_frame(index=False)
110
df_dtypes = df.dtypes.to_dict()
112
tm.assert_frame_equal(df, expected_df)
113
assert original_dtypes == df_dtypes
116
def test_to_frame_resulting_column_order():
118
expected = ["z", 0, "a"]
119
mi = pd.MultiIndex.from_arrays(
120
[["a", "b", "c"], ["x", "y", "z"], ["q", "w", "e"]], names=expected
122
result = mi.to_frame().columns.tolist()
123
assert result == expected
126
def test_to_flat_index(idx):
138
result = idx.to_flat_index()
139
tm.assert_index_equal(result, expected)