@@ -257,3 +257,52 @@ def test_concat_multiindex_dfs_with_deepcopy(self):
257257 tm .assert_frame_equal (result_copy , expected )
258258 result_no_copy = concat (example_dict , names = ["testname" ])
259259 tm .assert_frame_equal (result_no_copy , expected )
260+
261+ @pytest .mark .parametrize (
262+ "mi1_list" ,
263+ [
264+ [["a" ], range (2 )],
265+ [["b" ], np .arange (2.0 , 4.0 )],
266+ [["c" ], ["A" , "B" ]],
267+ [["d" ], pd .date_range (start = "2017" , end = "2018" , periods = 2 )],
268+ ],
269+ )
270+ @pytest .mark .parametrize (
271+ "mi2_list" ,
272+ [
273+ [["a" ], range (2 )],
274+ [["b" ], np .arange (2.0 , 4.0 )],
275+ [["c" ], ["A" , "B" ]],
276+ [["d" ], pd .date_range (start = "2017" , end = "2018" , periods = 2 )],
277+ ],
278+ )
279+ def test_concat_with_various_multiindex_dtypes (
280+ self , mi1_list : list , mi2_list : list
281+ ):
282+ # GitHub #23478
283+ mi1 = MultiIndex .from_product (mi1_list )
284+ mi2 = MultiIndex .from_product (mi2_list )
285+
286+ df1 = DataFrame (np .zeros ((1 , len (mi1 ))), columns = mi1 )
287+ df2 = DataFrame (np .zeros ((1 , len (mi2 ))), columns = mi2 )
288+
289+ if mi1_list [0 ] == mi2_list [0 ]:
290+ expected_mi = MultiIndex (
291+ levels = [mi1_list [0 ], list (mi1_list [1 ])],
292+ codes = [[0 , 0 , 0 , 0 ], [0 , 1 , 0 , 1 ]],
293+ )
294+ else :
295+ expected_mi = MultiIndex (
296+ levels = [
297+ mi1_list [0 ] + mi2_list [0 ],
298+ list (mi1_list [1 ]) + list (mi2_list [1 ]),
299+ ],
300+ codes = [[0 , 0 , 1 , 1 ], [0 , 1 , 2 , 3 ]],
301+ )
302+
303+ expected_df = DataFrame (np .zeros ((1 , len (expected_mi ))), columns = expected_mi )
304+
305+ with tm .assert_produces_warning (None ):
306+ result_df = concat ((df1 , df2 ), axis = 1 )
307+
308+ tm .assert_frame_equal (expected_df , result_df )
0 commit comments