From e0053b63f46171925619142db3859741d8473893 Mon Sep 17 00:00:00 2001
From: Justin Zheng <justinzhengbc@gmail.com>
Date: Sat, 9 Feb 2019 08:52:50 -0800
Subject: [PATCH] Backport PR #25202: BUG-25061 fix printing indices with NaNs

---
 doc/source/whatsnew/v0.24.2.rst  |  2 +-
 pandas/io/formats/format.py      | 11 +++++++++--
 pandas/tests/series/test_repr.py |  8 ++++++++
 3 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/doc/source/whatsnew/v0.24.2.rst b/doc/source/whatsnew/v0.24.2.rst
index 73df504c89d5b..30338f6fb876c 100644
--- a/doc/source/whatsnew/v0.24.2.rst
+++ b/doc/source/whatsnew/v0.24.2.rst
@@ -52,7 +52,7 @@ Bug Fixes
 **I/O**
 
 - Bug in reading a HDF5 table-format ``DataFrame`` created in Python 2, in Python 3 (:issue:`24925`)
--
+- Bug where float indexes could have misaligned values when printing (:issue:`25061`)
 -
 
 **Categorical**
diff --git a/pandas/io/formats/format.py b/pandas/io/formats/format.py
index 62fa04e784072..f68ef2cc39006 100644
--- a/pandas/io/formats/format.py
+++ b/pandas/io/formats/format.py
@@ -1060,19 +1060,26 @@ def get_result_as_array(self):
         def format_values_with(float_format):
             formatter = self._value_formatter(float_format, threshold)
 
+            # default formatter leaves a space to the left when formatting
+            # floats, must be consistent for left-justifying NaNs (GH #25061)
+            if self.justify == 'left':
+                na_rep = ' ' + self.na_rep
+            else:
+                na_rep = self.na_rep
+
             # separate the wheat from the chaff
             values = self.values
             mask = isna(values)
             if hasattr(values, 'to_dense'):  # sparse numpy ndarray
                 values = values.to_dense()
             values = np.array(values, dtype='object')
-            values[mask] = self.na_rep
+            values[mask] = na_rep
             imask = (~mask).ravel()
             values.flat[imask] = np.array([formatter(val)
                                            for val in values.ravel()[imask]])
 
             if self.fixed_width:
-                return _trim_zeros(values, self.na_rep)
+                return _trim_zeros(values, na_rep)
 
             return values
 
diff --git a/pandas/tests/series/test_repr.py b/pandas/tests/series/test_repr.py
index b4e7708e2456e..842207f2a572f 100644
--- a/pandas/tests/series/test_repr.py
+++ b/pandas/tests/series/test_repr.py
@@ -198,6 +198,14 @@ def test_latex_repr(self):
 
         assert s._repr_latex_() is None
 
+    def test_index_repr_in_frame_with_nan(self):
+        # see gh-25061
+        i = Index([1, np.nan])
+        s = Series([1, 2], index=i)
+        exp = """1.0    1\nNaN    2\ndtype: int64"""
+
+        assert repr(s) == exp
+
 
 class TestCategoricalRepr(object):