@@ -1248,16 +1248,25 @@ def _write_hierarchical_rows(self, fmt_values, indent):
1248
1248
# Insert ... row and adjust idx_values and
1249
1249
# level_lengths to take this into account.
1250
1250
ins_row = self .fmt .tr_row_num
1251
+ inserted = False
1251
1252
for lnum , records in enumerate (level_lengths ):
1252
1253
rec_new = {}
1253
1254
for tag , span in list (records .items ()):
1254
1255
if tag >= ins_row :
1255
1256
rec_new [tag + 1 ] = span
1256
1257
elif tag + span > ins_row :
1257
1258
rec_new [tag ] = span + 1
1258
- dot_row = list (idx_values [ins_row - 1 ])
1259
- dot_row [- 1 ] = u ('...' )
1260
- idx_values .insert (ins_row , tuple (dot_row ))
1259
+
1260
+ # GH 14882 - Make sure insertion done once
1261
+ if not inserted :
1262
+ dot_row = list (idx_values [ins_row - 1 ])
1263
+ dot_row [- 1 ] = u ('...' )
1264
+ idx_values .insert (ins_row , tuple (dot_row ))
1265
+ inserted = True
1266
+ else :
1267
+ dot_row = list (idx_values [ins_row ])
1268
+ dot_row [inner_lvl - lnum ] = u ('...' )
1269
+ idx_values [ins_row ] = tuple (dot_row )
1261
1270
else :
1262
1271
rec_new [tag ] = span
1263
1272
# If ins_row lies between tags, all cols idx cols
@@ -1267,6 +1276,12 @@ def _write_hierarchical_rows(self, fmt_values, indent):
1267
1276
if lnum == 0 :
1268
1277
idx_values .insert (ins_row , tuple (
1269
1278
[u ('...' )] * len (level_lengths )))
1279
+
1280
+ # GH 14882 - Place ... in correct level
1281
+ elif inserted :
1282
+ dot_row = list (idx_values [ins_row ])
1283
+ dot_row [inner_lvl - lnum ] = u ('...' )
1284
+ idx_values [ins_row ] = tuple (dot_row )
1270
1285
level_lengths [lnum ] = rec_new
1271
1286
1272
1287
level_lengths [inner_lvl ][ins_row ] = 1
0 commit comments