diff --git a/doc/source/whatsnew/v2.0.0.rst b/doc/source/whatsnew/v2.0.0.rst index 4577d20a509ce..47f03910d8a86 100644 --- a/doc/source/whatsnew/v2.0.0.rst +++ b/doc/source/whatsnew/v2.0.0.rst @@ -694,7 +694,9 @@ I/O - Improved error message in :func:`read_excel` by including the offending sheet name when an exception is raised while reading a file (:issue:`48706`) - Bug when a pickling a subset PyArrow-backed data that would serialize the entire data instead of the subset (:issue:`42600`) - Bug in :func:`read_csv` for a single-line csv with fewer columns than ``names`` raised :class:`.errors.ParserError` with ``engine="c"`` (:issue:`47566`) +- Bug in :func:`DataFrame.to_string` with ``header=False`` that printed the index name on the same line as the first row of the data (:issue:`49230`) - Fixed memory leak which stemmed from the initialization of the internal JSON module (:issue:`49222`) +- Period ^^^^^^ diff --git a/pandas/io/formats/printing.py b/pandas/io/formats/printing.py index 8091590e2e89d..0338cb018049b 100644 --- a/pandas/io/formats/printing.py +++ b/pandas/io/formats/printing.py @@ -51,7 +51,7 @@ def adjoin(space: int, *lists: list[str], **kwargs) -> str: maxLen = max(map(len, lists)) for i, lst in enumerate(lists): nl = justfunc(lst, lengths[i], mode="left") - nl.extend([" " * lengths[i]] * (maxLen - len(lst))) + nl = ([" " * lengths[i]] * (maxLen - len(lst))) + nl newLists.append(nl) toJoin = zip(*newLists) for lines in toJoin: diff --git a/pandas/tests/io/formats/test_format.py b/pandas/tests/io/formats/test_format.py index 640c686bb56ca..28590f040b8da 100644 --- a/pandas/tests/io/formats/test_format.py +++ b/pandas/tests/io/formats/test_format.py @@ -1411,25 +1411,25 @@ def test_to_string_no_index(self): assert df_s == expected def test_to_string_line_width_no_index(self): - # GH 13998, GH 22505 + # GH 13998, GH 22505, # GH 49230 df = DataFrame({"x": [1, 2, 3], "y": [4, 5, 6]}) df_s = df.to_string(line_width=1, index=False) - expected = " x \\\n 1 \n 2 \n 3 \n\n y \n 4 \n 5 \n 6 " + expected = " x \n 1 \\\n 2 \n 3 \n\n y \n 4 \n 5 \n 6 " assert df_s == expected df = DataFrame({"x": [11, 22, 33], "y": [4, 5, 6]}) df_s = df.to_string(line_width=1, index=False) - expected = " x \\\n11 \n22 \n33 \n\n y \n 4 \n 5 \n 6 " + expected = " x \n11 \\\n22 \n33 \n\n y \n 4 \n 5 \n 6 " assert df_s == expected df = DataFrame({"x": [11, 22, -33], "y": [4, 5, -6]}) df_s = df.to_string(line_width=1, index=False) - expected = " x \\\n 11 \n 22 \n-33 \n\n y \n 4 \n 5 \n-6 " + expected = " x \n 11 \\\n 22 \n-33 \n\n y \n 4 \n 5 \n-6 " assert df_s == expected @@ -1683,6 +1683,20 @@ def test_to_string_line_width(self): s = df.to_string(line_width=80) assert max(len(line) for line in s.split("\n")) == 80 + def test_to_string_header_false(self): + # GH 49230 + df = DataFrame([1, 2]) + df.index.name = "a" + s = df.to_string(header=False) + expected = "a \n0 1\n1 2" + assert s == expected + + df = DataFrame([[1, 2], [3, 4]]) + df.index.name = "a" + s = df.to_string(header=False) + expected = "a \n0 1 2\n1 3 4" + assert s == expected + def test_show_dimensions(self): df = DataFrame(123, index=range(10, 15), columns=range(30))