@@ -204,8 +204,6 @@ def test__make_df_column_names_unique(self) -> None:
204204 df1 = pd .DataFrame (data )
205205 df1 .columns = ["A" , "B" , "A" , "A" ]
206206
207- # TODO: understand in the future why the names here appear to be consistent while when using the function in
208- # `model_matrix` it does not appear to work.
209207 self .assertEqual (
210208 _make_df_column_names_unique (df1 ).to_dict (),
211209 {
@@ -216,6 +214,34 @@ def test__make_df_column_names_unique(self) -> None:
216214 },
217215 )
218216
217+ def test__make_df_column_names_unique_existing_suffixes (self ) -> None :
218+ """Ensure duplicate renaming does not collide with existing suffixed names."""
219+
220+ df = pd .DataFrame ([[1 , 2 , 3 , 4 ]], columns = ["a" , "a_1" , "a" , "a_2" ])
221+
222+ result = _make_df_column_names_unique (df )
223+
224+ self .assertEqual (result .columns .tolist (), ["a" , "a_1" , "a_2" , "a_2_1" ])
225+
226+ def test__make_df_column_names_unique_non_string_columns (self ) -> None :
227+ """Ensure duplicate renaming works for non-string column labels."""
228+
229+ df = pd .DataFrame ([[1 , 2 , 3 , 4 ]], columns = [1 , "1_1" , 1 , "1_2" ])
230+
231+ result = _make_df_column_names_unique (df )
232+
233+ self .assertEqual (result .columns .tolist (), [1 , "1_1" , "1_2" , "1_2_1" ])
234+
235+ def test__make_df_column_names_unique_when_already_unique (self ) -> None :
236+ """Return the input DataFrame unchanged when columns are already unique."""
237+
238+ df = pd .DataFrame ([[1 , 2 ]], columns = ["a" , "b" ])
239+
240+ result = _make_df_column_names_unique (df )
241+
242+ self .assertIs (result , df )
243+ self .assertEqual (result .columns .tolist (), ["a" , "b" ])
244+
219245 def test__safe_replace_and_infer (self ) -> None :
220246 """Test safe replacement and dtype inference to avoid pandas deprecation warnings."""
221247 # Test with Series containing infinities
@@ -268,6 +294,16 @@ def test__safe_fillna_and_infer(self) -> None:
268294 expected = pd .DataFrame ({"a" : [1.0 , - 1.0 , 2.0 ], "b" : [- 1.0 , 3.0 , 4.0 ]})
269295 pd .testing .assert_frame_equal (result , expected )
270296
297+ # Test with DataFrame containing object columns to cover object-cast branch
298+ df_with_obj = pd .DataFrame ({"a" : ["x" , None ], "b" : [1 , None ]}, dtype = object )
299+ result = _safe_fillna_and_infer (df_with_obj , value = "missing" )
300+ expected = pd .DataFrame (
301+ {"a" : ["x" , "missing" ], "b" : [1 , "missing" ]}, dtype = object
302+ )
303+ pd .testing .assert_frame_equal (result , expected )
304+ self .assertEqual (result ["a" ].dtype , object )
305+ self .assertEqual (result ["b" ].dtype , object )
306+
271307 # Test with string replacement
272308 series_str = pd .Series (["a" , None , "c" ])
273309 result = _safe_fillna_and_infer (series_str , value = "_NA" )
0 commit comments