Skip to content

Commit d63e88f

Browse files
committed
Refactor multiindex unmerging to be cleaner
1 parent 5dbe1af commit d63e88f

File tree

1 file changed

+26
-29
lines changed

1 file changed

+26
-29
lines changed

pandas/io/formats/format.py

+26-29
Original file line numberDiff line numberDiff line change
@@ -904,37 +904,34 @@ def get_col_type(dtype):
904904

905905
# reestablish the MultiIndex that has been joined by _to_str_column
906906
if self.fmt.index and isinstance(self.frame.index, MultiIndex):
907+
out = self.frame.index.format(
908+
adjoin=False, sparsify=self.fmt.sparsify,
909+
names=any(self.frame.index.names), na_rep=self.fmt.na_rep
910+
)
911+
912+
# index.format will sparsify repeated entries with empty strings
913+
# so pad these with some empty space
914+
def pad_empties(x):
915+
for pad in x[::-1]:
916+
if pad:
917+
break
918+
return [x[0]] + [i if i else ' ' * len(pad) for i in x[1:]]
919+
out = (pad_empties(x) for x in out)
920+
921+
# Add empty spaces for each column level
907922
clevels = self.frame.columns.nlevels
923+
out = [[' ' * len(x[-1])] * clevels + x for x in out]
924+
925+
# Add the column names to the last index column
926+
cnames = self.frame.columns.names
927+
if any(cnames):
928+
new_names = [i if i else '{}' for i in cnames]
929+
out[self.frame.index.nlevels - 1][:clevels] = new_names
930+
931+
# Get rid of old multiindex column and add new ones
908932
strcols.pop(0)
909-
name = any(self.frame.index.names)
910-
cname = any(self.frame.columns.names)
911-
lastcol = self.frame.index.nlevels - 1
912-
previous_lev3 = None
913-
for i, lev in enumerate(self.frame.index.levels):
914-
lev2 = lev.format()
915-
blank = (' ' * len(lev2[0]) if lev2 else
916-
' ' * len(self.fmt.na_rep))
917-
# display column names in last index-column
918-
if cname and i == lastcol:
919-
lev3 = [x if x else '{}' for x in self.frame.columns.names]
920-
else:
921-
lev3 = [blank] * clevels
922-
if name:
923-
lev3.append(lev.name)
924-
current_idx_val = None
925-
for level_idx in self.frame.index.labels[i]:
926-
idx_val = (lev2[level_idx] if level_idx >= 0 else
927-
self.fmt.na_rep)
928-
if ((previous_lev3 is None or
929-
previous_lev3[len(lev3)].isspace()) and
930-
idx_val == current_idx_val):
931-
# same index as above row and left index was the same
932-
lev3.append(blank)
933-
else:
934-
lev3.append(idx_val)
935-
current_idx_val = idx_val
936-
strcols.insert(i, lev3)
937-
previous_lev3 = lev3
933+
for i, o in enumerate(out):
934+
strcols.insert(i, o)
938935

939936
column_format = self.column_format
940937
if column_format is None:

0 commit comments

Comments
 (0)