@@ -967,6 +967,98 @@ def test_left_join_index_preserve_order(self):
967
967
right_on = ['k1' , 'k2' ], how = 'right' )
968
968
tm .assert_frame_equal (joined .ix [:, expected .columns ], expected )
969
969
970
+ def test_left_join_index_multi_match_multiindex (self ):
971
+ left = DataFrame ([
972
+ ['X' , 'Y' , 'C' , 'a' ],
973
+ ['W' , 'Y' , 'C' , 'e' ],
974
+ ['V' , 'Q' , 'A' , 'h' ],
975
+ ['V' , 'R' , 'D' , 'i' ],
976
+ ['X' , 'Y' , 'D' , 'b' ],
977
+ ['X' , 'Y' , 'A' , 'c' ],
978
+ ['W' , 'Q' , 'B' , 'f' ],
979
+ ['W' , 'R' , 'C' , 'g' ],
980
+ ['V' , 'Y' , 'C' , 'j' ],
981
+ ['X' , 'Y' , 'B' , 'd' ]],
982
+ columns = ['cola' , 'colb' , 'colc' , 'tag' ],
983
+ index = [3 , 2 , 0 , 1 , 7 , 6 , 4 , 5 , 9 , 8 ])
984
+
985
+ right = DataFrame ([
986
+ ['W' , 'R' , 'C' , 0 ],
987
+ ['W' , 'Q' , 'B' , 3 ],
988
+ ['W' , 'Q' , 'B' , 8 ],
989
+ ['X' , 'Y' , 'A' , 1 ],
990
+ ['X' , 'Y' , 'A' , 4 ],
991
+ ['X' , 'Y' , 'B' , 5 ],
992
+ ['X' , 'Y' , 'C' , 6 ],
993
+ ['X' , 'Y' , 'C' , 9 ],
994
+ ['X' , 'Q' , 'C' , - 6 ],
995
+ ['X' , 'R' , 'C' , - 9 ],
996
+ ['V' , 'Y' , 'C' , 7 ],
997
+ ['V' , 'R' , 'D' , 2 ],
998
+ ['V' , 'R' , 'D' , - 1 ],
999
+ ['V' , 'Q' , 'A' , - 3 ]],
1000
+ columns = ['col1' , 'col2' , 'col3' , 'val' ])
1001
+
1002
+ right .set_index (['col1' , 'col2' , 'col3' ], inplace = True )
1003
+ result = left .join (right , on = ['cola' , 'colb' , 'colc' ], how = 'left' )
1004
+
1005
+ expected = DataFrame ([
1006
+ ['X' , 'Y' , 'C' , 'a' , 6 ],
1007
+ ['X' , 'Y' , 'C' , 'a' , 9 ],
1008
+ ['W' , 'Y' , 'C' , 'e' , nan ],
1009
+ ['V' , 'Q' , 'A' , 'h' , - 3 ],
1010
+ ['V' , 'R' , 'D' , 'i' , 2 ],
1011
+ ['V' , 'R' , 'D' , 'i' , - 1 ],
1012
+ ['X' , 'Y' , 'D' , 'b' , nan ],
1013
+ ['X' , 'Y' , 'A' , 'c' , 1 ],
1014
+ ['X' , 'Y' , 'A' , 'c' , 4 ],
1015
+ ['W' , 'Q' , 'B' , 'f' , 3 ],
1016
+ ['W' , 'Q' , 'B' , 'f' , 8 ],
1017
+ ['W' , 'R' , 'C' , 'g' , 0 ],
1018
+ ['V' , 'Y' , 'C' , 'j' , 7 ],
1019
+ ['X' , 'Y' , 'B' , 'd' , 5 ]],
1020
+ columns = ['cola' , 'colb' , 'colc' , 'tag' , 'val' ],
1021
+ index = [3 , 3 , 2 , 0 , 1 , 1 , 7 , 6 , 6 , 4 , 4 , 5 , 9 , 8 ])
1022
+
1023
+ tm .assert_frame_equal (result , expected )
1024
+
1025
+ def test_left_join_index_multi_match (self ):
1026
+ left = DataFrame ([
1027
+ ['c' , 0 ],
1028
+ ['b' , 1 ],
1029
+ ['a' , 2 ],
1030
+ ['b' , 3 ]],
1031
+ columns = ['tag' , 'val' ],
1032
+ index = [2 , 0 , 1 , 3 ])
1033
+
1034
+ right = DataFrame ([
1035
+ ['a' , 'v' ],
1036
+ ['c' , 'w' ],
1037
+ ['c' , 'x' ],
1038
+ ['d' , 'y' ],
1039
+ ['a' , 'z' ],
1040
+ ['c' , 'r' ],
1041
+ ['e' , 'q' ],
1042
+ ['c' , 's' ]],
1043
+ columns = ['tag' , 'char' ])
1044
+
1045
+ right .set_index ('tag' , inplace = True )
1046
+ result = left .join (right , on = 'tag' , how = 'left' )
1047
+
1048
+ expected = DataFrame ([
1049
+ ['c' , 0 , 'w' ],
1050
+ ['c' , 0 , 'x' ],
1051
+ ['c' , 0 , 'r' ],
1052
+ ['c' , 0 , 's' ],
1053
+ ['b' , 1 , nan ],
1054
+ ['a' , 2 , 'v' ],
1055
+ ['a' , 2 , 'z' ],
1056
+ ['b' , 3 , nan ]],
1057
+ columns = ['tag' , 'val' , 'char' ],
1058
+ index = [2 , 2 , 2 , 2 , 0 , 1 , 1 , 3 ])
1059
+
1060
+ tm .assert_frame_equal (result , expected )
1061
+
970
1062
def test_join_multi_dtypes (self ):
971
1063
972
1064
# test with multi dtypes in the join index
0 commit comments