From 082621277a37ee47bc5aba3b937f662e313902d9 Mon Sep 17 00:00:00 2001 From: Markus Frey Date: Thu, 25 Jan 2024 13:39:21 +0100 Subject: [PATCH 1/3] Fix for pandas issue #56929, including new test --- pandas/_libs/parsers.pyx | 2 +- pandas/tests/io/formats/test_to_csv.py | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/pandas/_libs/parsers.pyx b/pandas/_libs/parsers.pyx index 82e9812094af2..90d97052cb435 100644 --- a/pandas/_libs/parsers.pyx +++ b/pandas/_libs/parsers.pyx @@ -746,7 +746,7 @@ cdef class TextReader: is not None else 0) # if wrong number of blanks or no index, not our format - if (lc != unnamed_count and lc - ic > unnamed_count) or ic == 0: + if (lc != unnamed_count and lc - ic >= unnamed_count) or ic == 0: hr -= 1 self.parser_start -= 1 this_header = [None] * lc diff --git a/pandas/tests/io/formats/test_to_csv.py b/pandas/tests/io/formats/test_to_csv.py index 0db49a73621ea..52d2dfe33c7e0 100644 --- a/pandas/tests/io/formats/test_to_csv.py +++ b/pandas/tests/io/formats/test_to_csv.py @@ -332,6 +332,22 @@ def test_to_csv_float_ea_no_float_format(self): ) assert result == expected + def test_to_csv_multi_index_nan(self): + # Create a MultiIndex DataFrame + columns = pd.MultiIndex.from_tuples([('Level 1', 'Level 2')], names=['level1', 'level2']) + data = [[np.nan], [0.1], [0.4]] + df_complex = pd.DataFrame(data, columns=columns) + + # Expected DataFrame + expected_df = pd.DataFrame(data, columns=columns, index=range(3)) + + # Save and load the DataFrame as a CSV + with tm.ensure_clean("complex_data.csv") as path: + df_complex.to_csv(path) + loaded_df_complex = pd.read_csv(path, header=[0, 1], index_col=0) + + tm.assert_frame_equal(loaded_df_complex, expected_df) + def test_to_csv_multi_index(self): # see gh-6618 df = DataFrame([1], columns=pd.MultiIndex.from_arrays([[1], [2]])) From 79edb62f89df0c91237dec0197804781648ff9ef Mon Sep 17 00:00:00 2001 From: Markus Frey Date: Thu, 25 Jan 2024 13:45:07 +0100 Subject: [PATCH 2/3] after precommit change of files --- pandas/tests/io/formats/test_to_csv.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pandas/tests/io/formats/test_to_csv.py b/pandas/tests/io/formats/test_to_csv.py index 52d2dfe33c7e0..0a16f2d643695 100644 --- a/pandas/tests/io/formats/test_to_csv.py +++ b/pandas/tests/io/formats/test_to_csv.py @@ -334,12 +334,14 @@ def test_to_csv_float_ea_no_float_format(self): def test_to_csv_multi_index_nan(self): # Create a MultiIndex DataFrame - columns = pd.MultiIndex.from_tuples([('Level 1', 'Level 2')], names=['level1', 'level2']) + columns = pd.MultiIndex.from_tuples( + [("Level 1", "Level 2")], names=["level1", "level2"] + ) data = [[np.nan], [0.1], [0.4]] - df_complex = pd.DataFrame(data, columns=columns) + df_complex = DataFrame(data, columns=columns) # Expected DataFrame - expected_df = pd.DataFrame(data, columns=columns, index=range(3)) + expected_df = DataFrame(data, columns=columns, index=range(3)) # Save and load the DataFrame as a CSV with tm.ensure_clean("complex_data.csv") as path: From 85f8fb90589a8abb1314233500899632b3fb4030 Mon Sep 17 00:00:00 2001 From: Markus Frey Date: Thu, 25 Jan 2024 14:12:53 +0100 Subject: [PATCH 3/3] Fix line too long pre-commit error --- pandas/_libs/parsers.pyx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pandas/_libs/parsers.pyx b/pandas/_libs/parsers.pyx index 90d97052cb435..afce66391de80 100644 --- a/pandas/_libs/parsers.pyx +++ b/pandas/_libs/parsers.pyx @@ -746,7 +746,8 @@ cdef class TextReader: is not None else 0) # if wrong number of blanks or no index, not our format - if (lc != unnamed_count and lc - ic >= unnamed_count) or ic == 0: + if ((lc != unnamed_count and lc - ic >= unnamed_count) or + ic == 0): hr -= 1 self.parser_start -= 1 this_header = [None] * lc