@@ -582,11 +582,11 @@ def test_merge_empty_frame(self, series_of_dtype, series_of_dtype2):
582
582
df_empty = df [:0 ]
583
583
expected = DataFrame (
584
584
{
585
- "value_x" : Series (dtype = df .dtypes ["value" ]),
586
585
"key" : Series (dtype = df .dtypes ["key" ]),
586
+ "value_x" : Series (dtype = df .dtypes ["value" ]),
587
587
"value_y" : Series (dtype = df .dtypes ["value" ]),
588
588
},
589
- columns = ["value_x " , "key " , "value_y" ],
589
+ columns = ["key " , "value_x " , "value_y" ],
590
590
)
591
591
actual = df_empty .merge (df , on = "key" )
592
592
tm .assert_frame_equal (actual , expected )
@@ -889,13 +889,13 @@ def test_merge_on_datetime64tz_empty(self):
889
889
result = left .merge (right , on = "date" )
890
890
expected = DataFrame (
891
891
{
892
+ "date" : Series (dtype = dtz ),
892
893
"value_x" : Series (dtype = float ),
893
894
"date2_x" : Series (dtype = dtz ),
894
- "date" : Series (dtype = dtz ),
895
895
"value_y" : Series (dtype = float ),
896
896
"date2_y" : Series (dtype = dtz ),
897
897
},
898
- columns = ["value_x " , "date2_x " , "date " , "value_y" , "date2_y" ],
898
+ columns = ["date " , "value_x " , "date2_x " , "value_y" , "date2_y" ],
899
899
)
900
900
tm .assert_frame_equal (result , expected )
901
901
@@ -1827,11 +1827,9 @@ def test_merge_empty(self, left_empty, how, exp):
1827
1827
if exp == "left" :
1828
1828
expected = DataFrame ({"A" : [2 , 1 ], "B" : [3 , 4 ], "C" : [np .nan , np .nan ]})
1829
1829
elif exp == "right" :
1830
- expected = DataFrame ({"B " : [np . nan ], "A " : [1 ], "C" : [5 ]})
1830
+ expected = DataFrame ({"A " : [1 ], "B " : [np . nan ], "C" : [5 ]})
1831
1831
elif exp == "empty" :
1832
1832
expected = DataFrame (columns = ["A" , "B" , "C" ], dtype = "int64" )
1833
- if left_empty :
1834
- expected = expected [["B" , "A" , "C" ]]
1835
1833
elif exp == "empty_cross" :
1836
1834
expected = DataFrame (columns = ["A_x" , "B" , "A_y" , "C" ], dtype = "int64" )
1837
1835
@@ -2481,14 +2479,12 @@ def test_merge_multiindex_columns():
2481
2479
result = frame_x .merge (frame_y , on = "id" , suffixes = ((l_suf , r_suf )))
2482
2480
2483
2481
# Constructing the expected results
2484
- expected_labels = [letter + l_suf for letter in letters ] + [
2485
- letter + r_suf for letter in letters
2486
- ]
2487
- expected_index = MultiIndex .from_product (
2488
- [expected_labels , numbers ], names = ["outer" , "inner" ]
2489
- )
2482
+ tuples = [(letter + l_suf , num ) for letter in letters for num in numbers ]
2483
+ tuples += [("id" , "" )]
2484
+ tuples += [(letter + r_suf , num ) for letter in letters for num in numbers ]
2485
+
2486
+ expected_index = MultiIndex .from_tuples (tuples , names = ["outer" , "inner" ])
2490
2487
expected = DataFrame (columns = expected_index )
2491
- expected ["id" ] = ""
2492
2488
2493
2489
tm .assert_frame_equal (result , expected )
2494
2490
@@ -2959,3 +2955,26 @@ def test_merge_arrow_string_index(any_string_dtype):
2959
2955
{"a" : Series (["a" , "b" ], dtype = any_string_dtype ), "b" : [1 , np .nan ]}
2960
2956
)
2961
2957
tm .assert_frame_equal (result , expected )
2958
+
2959
+
2960
+ @pytest .mark .parametrize ("left_empty" , [True , False ])
2961
+ @pytest .mark .parametrize ("right_empty" , [True , False ])
2962
+ def test_merge_empty_frames_column_order (left_empty , right_empty ):
2963
+ # GH 51929
2964
+ df1 = DataFrame (1 , index = [0 ], columns = ["A" , "B" ])
2965
+ df2 = DataFrame (1 , index = [0 ], columns = ["A" , "C" , "D" ])
2966
+
2967
+ if left_empty :
2968
+ df1 = df1 .iloc [:0 ]
2969
+ if right_empty :
2970
+ df2 = df2 .iloc [:0 ]
2971
+
2972
+ result = merge (df1 , df2 , on = ["A" ], how = "outer" )
2973
+ expected = DataFrame (1 , index = [0 ], columns = ["A" , "B" , "C" , "D" ])
2974
+ if left_empty and right_empty :
2975
+ expected = expected .iloc [:0 ]
2976
+ elif left_empty :
2977
+ expected .loc [:, "B" ] = np .nan
2978
+ elif right_empty :
2979
+ expected .loc [:, ["C" , "D" ]] = np .nan
2980
+ tm .assert_frame_equal (result , expected )
0 commit comments