Skip to content

Commit f5efd3b

Browse files
committed
BUG: to_latex() output broken when the index has a name #10660
1 parent 0cd6734 commit f5efd3b

File tree

3 files changed

+51
-2
lines changed

3 files changed

+51
-2
lines changed

doc/source/whatsnew/v0.17.1.txt

+1
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,4 @@ Performance Improvements
4242

4343
Bug Fixes
4444
~~~~~~~~~
45+
Bug in ``.to_latex()`` output broken when the index has a name (:issue: `10660`)

pandas/core/format.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -636,11 +636,13 @@ def get_col_type(dtype):
636636
if self.index and isinstance(self.frame.index, MultiIndex):
637637
clevels = self.frame.columns.nlevels
638638
strcols.pop(0)
639-
name = any(self.frame.columns.names)
639+
name = any(self.frame.index.names)
640640
for i, lev in enumerate(self.frame.index.levels):
641-
lev2 = lev.format(name=name)
641+
lev2 = lev.format()
642642
blank = ' ' * len(lev2[0])
643643
lev3 = [blank] * clevels
644+
if name:
645+
lev3.append(lev.name)
644646
for level_idx, group in itertools.groupby(
645647
self.frame.index.labels[i]):
646648
count = len(list(group))
@@ -667,6 +669,8 @@ def write(buf, frame, column_format, strcols, longtable=False):
667669
buf.write('\\toprule\n')
668670

669671
nlevels = frame.columns.nlevels
672+
if any(frame.index.names):
673+
nlevels += 1
670674
for i, row in enumerate(zip(*strcols)):
671675
if i == nlevels:
672676
buf.write('\\midrule\n') # End of header

pandas/tests/test_format.py

+44
Original file line numberDiff line numberDiff line change
@@ -2645,6 +2645,50 @@ def test_to_latex_multiindex(self):
26452645
c3 & 0 & 0 & 1 & 2 & 3 \\
26462646
\bottomrule
26472647
\end{tabular}
2648+
"""
2649+
self.assertEqual(result, expected)
2650+
2651+
# GH 10660
2652+
df = pd.DataFrame({'a':[0,0,1,1], 'b':list('abab'), 'c':[1,2,3,4]})
2653+
result = df.set_index(['a', 'b']).to_latex()
2654+
expected = r"""\begin{tabular}{llr}
2655+
\toprule
2656+
& & c \\
2657+
a & b & \\
2658+
\midrule
2659+
0 & a & 1 \\
2660+
& b & 2 \\
2661+
1 & a & 3 \\
2662+
& b & 4 \\
2663+
\bottomrule
2664+
\end{tabular}
2665+
"""
2666+
self.assertEqual(result, expected)
2667+
2668+
result = df.groupby('a').describe().to_latex()
2669+
expected = r"""\begin{tabular}{llr}
2670+
\toprule
2671+
& & c \\
2672+
a & {} & \\
2673+
\midrule
2674+
0 & count & 2.000000 \\
2675+
& mean & 1.500000 \\
2676+
& std & 0.707107 \\
2677+
& min & 1.000000 \\
2678+
& 25\% & 1.250000 \\
2679+
& 50\% & 1.500000 \\
2680+
& 75\% & 1.750000 \\
2681+
& max & 2.000000 \\
2682+
1 & count & 2.000000 \\
2683+
& mean & 3.500000 \\
2684+
& std & 0.707107 \\
2685+
& min & 3.000000 \\
2686+
& 25\% & 3.250000 \\
2687+
& 50\% & 3.500000 \\
2688+
& 75\% & 3.750000 \\
2689+
& max & 4.000000 \\
2690+
\bottomrule
2691+
\end{tabular}
26482692
"""
26492693
self.assertEqual(result, expected)
26502694

0 commit comments

Comments
 (0)