@@ -257,3 +257,52 @@ def test_concat_multiindex_dfs_with_deepcopy(self):
257
257
tm .assert_frame_equal (result_copy , expected )
258
258
result_no_copy = concat (example_dict , names = ["testname" ])
259
259
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