|
88 | 88 | Categorical,
|
89 | 89 | ExtensionArray,
|
90 | 90 | )
|
91 |
| -from pandas.core.arrays.categorical import factorize_from_iterables |
| 91 | +from pandas.core.arrays.categorical import ( |
| 92 | + factorize_from_iterables, |
| 93 | + recode_for_categories, |
| 94 | +) |
92 | 95 | import pandas.core.common as com
|
93 | 96 | from pandas.core.construction import sanitize_array
|
94 | 97 | import pandas.core.indexes.base as ibase
|
@@ -2145,14 +2148,28 @@ def append(self, other):
|
2145 | 2148 | if all(
|
2146 | 2149 | (isinstance(o, MultiIndex) and o.nlevels >= self.nlevels) for o in other
|
2147 | 2150 | ):
|
2148 |
| - arrays, names = [], [] |
| 2151 | + codes = [] |
| 2152 | + levels = [] |
| 2153 | + names = [] |
2149 | 2154 | for i in range(self.nlevels):
|
2150 |
| - label = self._get_level_values(i) |
2151 |
| - appended = [o._get_level_values(i) for o in other] |
2152 |
| - arrays.append(label.append(appended)) |
2153 |
| - single_label_name = all(label.name == x.name for x in appended) |
2154 |
| - names.append(label.name if single_label_name else None) |
2155 |
| - return MultiIndex.from_arrays(arrays, names=names) |
| 2155 | + level_values = self.levels[i] |
| 2156 | + for mi in other: |
| 2157 | + level_values = level_values.union(mi.levels[i]) |
| 2158 | + level_codes = [ |
| 2159 | + recode_for_categories( |
| 2160 | + mi.codes[i], mi.levels[i], level_values, copy=False |
| 2161 | + ) |
| 2162 | + for mi in ([self, *other]) |
| 2163 | + ] |
| 2164 | + level_name = self.names[i] |
| 2165 | + if any(mi.names[i] != level_name for mi in other): |
| 2166 | + level_name = None |
| 2167 | + codes.append(np.concatenate(level_codes)) |
| 2168 | + levels.append(level_values) |
| 2169 | + names.append(level_name) |
| 2170 | + return MultiIndex( |
| 2171 | + codes=codes, levels=levels, names=names, verify_integrity=False |
| 2172 | + ) |
2156 | 2173 |
|
2157 | 2174 | to_concat = (self._values,) + tuple(k._values for k in other)
|
2158 | 2175 | new_tuples = np.concatenate(to_concat)
|
|
0 commit comments