From c3861f9cee050c4db9573649549f198604d4faa2 Mon Sep 17 00:00:00 2001 From: Andrew Leverentz Date: Wed, 2 Nov 2016 10:57:45 -0700 Subject: [PATCH 1/4] BUG: Fix justification for DataFrame.to_string(index=False) --- pandas/formats/format.py | 4 +++- pandas/tests/formats/test_format.py | 21 +++++++++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/pandas/formats/format.py b/pandas/formats/format.py index 7706666142a64..7f7a9e222a298 100644 --- a/pandas/formats/format.py +++ b/pandas/formats/format.py @@ -605,7 +605,9 @@ def to_string(self): strcols = self._to_str_columns() text = self.adj.adjoin(1, *strcols) if not self.index: - text = text.replace('\n ', '\n').strip() + # Remove a single space from the beginning of each line + # and remove any trailing spaces + text = text.replace('\n ', '\n')[1:].rstrip() self.buf.writelines(text) if self.should_show_dimensions: diff --git a/pandas/tests/formats/test_format.py b/pandas/tests/formats/test_format.py index 3bbfd621d2342..7e861501d6362 100644 --- a/pandas/tests/formats/test_format.py +++ b/pandas/tests/formats/test_format.py @@ -1974,11 +1974,28 @@ def test_to_string_no_header(self): self.assertEqual(df_s, expected) def test_to_string_no_index(self): - df = DataFrame({'x': [1, 2, 3], 'y': [4, 5, 6]}) + df = DataFrame({'aaaaa': [100, 200, 300], 'bbbbb': [400, 500, 600]}) + df_s = df.to_string(index=False) + expected = "aaaaa bbbbb\n" \ + " 100 400\n" \ + " 200 500\n" \ + " 300 600" + self.assertEqual(df_s, expected) + df = DataFrame({'aaa': [100, 200, 300], 'bbb': [400, 500, 600]}) df_s = df.to_string(index=False) - expected = "x y\n1 4\n2 5\n3 6" + expected = "aaa bbb\n" \ + "100 400\n" \ + "200 500\n" \ + "300 600" + self.assertEqual(df_s, expected) + df = DataFrame({'a': [100, 200, 300], 'b': [400, 500, 600]}) + df_s = df.to_string(index=False) + expected = " a b\n" \ + "100 400\n" \ + "200 500\n" \ + "300 600" self.assertEqual(df_s, expected) def test_to_string_line_width_no_index(self): From 20f8744bee943d8e0b10e049fa0ce223e2bef86d Mon Sep 17 00:00:00 2001 From: Andrew Leverentz Date: Wed, 2 Nov 2016 11:27:32 -0700 Subject: [PATCH 2/4] Only remove first character if it is a space --- pandas/formats/format.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pandas/formats/format.py b/pandas/formats/format.py index 7f7a9e222a298..0f6ba4950b2ea 100644 --- a/pandas/formats/format.py +++ b/pandas/formats/format.py @@ -607,7 +607,9 @@ def to_string(self): if not self.index: # Remove a single space from the beginning of each line # and remove any trailing spaces - text = text.replace('\n ', '\n')[1:].rstrip() + if len(text) > 0 and text[0] == ' ': + text = text[1:] + text = text.replace('\n ', '\n').rstrip() self.buf.writelines(text) if self.should_show_dimensions: From 4b0e4c8f0c62abef65ba51637c7945fe2011c247 Mon Sep 17 00:00:00 2001 From: Andrew Leverentz Date: Thu, 3 Nov 2016 13:19:21 -0700 Subject: [PATCH 3/4] [broken] test case with strings and floats --- pandas/tests/formats/test_format.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/pandas/tests/formats/test_format.py b/pandas/tests/formats/test_format.py index 7e861501d6362..4b070415b5ab9 100644 --- a/pandas/tests/formats/test_format.py +++ b/pandas/tests/formats/test_format.py @@ -1998,6 +1998,24 @@ def test_to_string_no_index(self): "300 600" self.assertEqual(df_s, expected) + df = DataFrame({'aaaaa': ['xxx', 'xxx', 'xxx'], + 'bbbbb': ['xxx', 'xxx', 'xxx']}) + df_s = df.to_string(index=False) + expected = "aaaaa bbbbb\n" \ + " xxx xxx\n" \ + " xxx xxx\n" \ + " xxx xxx" + self.assertEqual(df_s, expected) + + df = DataFrame({'aaaaa': [-1.0, -2.0, -3.0], + 'bbbbb': [-4.0, -5.0, -6.0]}) + df_s = df.to_string(index=False) + expected = "aaaaa bbbbb\n" \ + " -1.0 -4.0\n" \ + " -2.0 -5.0\n" \ + " -3.0 -6.0" + self.assertEqual(df_s, expected) + def test_to_string_line_width_no_index(self): df = DataFrame({'x': [1, 2, 3], 'y': [4, 5, 6]}) From 8bf0428fe21d128fb607fc00b5062f1f2a7cd0d3 Mon Sep 17 00:00:00 2001 From: Andrew Leverentz Date: Thu, 3 Nov 2016 17:39:49 -0700 Subject: [PATCH 4/4] [fragile] Only remove whitespace for subset of dtypes --- pandas/formats/format.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pandas/formats/format.py b/pandas/formats/format.py index 0f6ba4950b2ea..20065c6d9c4b6 100644 --- a/pandas/formats/format.py +++ b/pandas/formats/format.py @@ -604,7 +604,10 @@ def to_string(self): self._chk_truncate() strcols = self._to_str_columns() text = self.adj.adjoin(1, *strcols) - if not self.index: + + first_column_dtype = (None if len(frame.columns) == 0 + else frame.dtypes[frame.columns[0]]) + if not self.index and first_column_dtype.kind != 'O': # Remove a single space from the beginning of each line # and remove any trailing spaces if len(text) > 0 and text[0] == ' ':