|
| 1 | +from natsort import index_natsorted |
1 | 2 | import numpy as np |
2 | 3 | import pytest |
3 | 4 |
|
@@ -943,6 +944,88 @@ def test_sort_index_multiindex_sort_remaining(self, ascending): |
943 | 944 |
|
944 | 945 | tm.assert_frame_equal(result, expected) |
945 | 946 |
|
| 947 | + def test_sort_multi_index_sort_by_level_name(self): |
| 948 | + # GH#62361 |
| 949 | + |
| 950 | + df = DataFrame( |
| 951 | + [[1, 2], [3, 4]], |
| 952 | + columns=MultiIndex.from_product( |
| 953 | + [["a"], ["top10", "top2"]], names=("A", "B") |
| 954 | + ), |
| 955 | + ) |
| 956 | + |
| 957 | + expected = DataFrame( |
| 958 | + [[2, 1], [4, 3]], |
| 959 | + columns=MultiIndex.from_product( |
| 960 | + [["a"], ["top2", "top10"]], names=("A", "B") |
| 961 | + ), |
| 962 | + ) |
| 963 | + |
| 964 | + sorted_df = df.sort_index( |
| 965 | + axis=1, level="B", key=lambda x: np.argsort(index_natsorted(x)) |
| 966 | + ) |
| 967 | + tm.assert_frame_equal(sorted_df, expected) |
| 968 | + |
| 969 | + def test_sort_multi_index_sort_by_level_name_2(self): |
| 970 | + # GH#62361 |
| 971 | + |
| 972 | + df = DataFrame( |
| 973 | + [[1, 2], [3, 4]], |
| 974 | + columns=MultiIndex.from_tuples( |
| 975 | + [("alpha10", "top10"), ("alpha3", "top2")], names=("A", "B") |
| 976 | + ), |
| 977 | + ) |
| 978 | + |
| 979 | + expected = DataFrame( |
| 980 | + [[2, 1], [4, 3]], |
| 981 | + columns=MultiIndex.from_tuples( |
| 982 | + [("alpha3", "top2"), ("alpha10", "top10")], names=("A", "B") |
| 983 | + ), |
| 984 | + ) |
| 985 | + |
| 986 | + sorted_df = df.sort_index( |
| 987 | + axis=1, level=0, key=lambda x: np.argsort(index_natsorted(x)) |
| 988 | + ) |
| 989 | + tm.assert_frame_equal(sorted_df, expected) |
| 990 | + |
| 991 | + sorted_df = df.sort_index( |
| 992 | + axis=1, level="A", key=lambda x: np.argsort(index_natsorted(x)) |
| 993 | + ) |
| 994 | + tm.assert_frame_equal(sorted_df, expected) |
| 995 | + |
| 996 | + sorted_df = df.sort_index( |
| 997 | + axis=1, level=1, key=lambda x: np.argsort(index_natsorted(x)) |
| 998 | + ) |
| 999 | + tm.assert_frame_equal(sorted_df, expected) |
| 1000 | + |
| 1001 | + sorted_df = df.sort_index( |
| 1002 | + axis=1, level="B", key=lambda x: np.argsort(index_natsorted(x)) |
| 1003 | + ) |
| 1004 | + tm.assert_frame_equal(sorted_df, expected) |
| 1005 | + |
| 1006 | + sorted_df = df.sort_index( |
| 1007 | + axis=1, level=[0, 1], key=lambda x: np.argsort(index_natsorted(x)) |
| 1008 | + ) |
| 1009 | + tm.assert_frame_equal(sorted_df, expected) |
| 1010 | + |
| 1011 | + sorted_df = df.sort_index( |
| 1012 | + axis=1, level=[1, 0], key=lambda x: np.argsort(index_natsorted(x)) |
| 1013 | + ) |
| 1014 | + tm.assert_frame_equal(sorted_df, expected) |
| 1015 | + |
| 1016 | + sorted_df = df.sort_index( |
| 1017 | + axis=1, level=[1, "A"], key=lambda x: np.argsort(index_natsorted(x)) |
| 1018 | + ) |
| 1019 | + tm.assert_frame_equal(sorted_df, expected) |
| 1020 | + |
| 1021 | + # repetition does not matter |
| 1022 | + sorted_df = df.sort_index( |
| 1023 | + axis=1, |
| 1024 | + level=["A", "B", 0, 1, "B"], |
| 1025 | + key=lambda x: np.argsort(index_natsorted(x)), |
| 1026 | + ) |
| 1027 | + tm.assert_frame_equal(sorted_df, expected) |
| 1028 | + |
946 | 1029 |
|
947 | 1030 | def test_sort_index_with_sliced_multiindex(): |
948 | 1031 | # GH 55379 |
|
0 commit comments