@@ -119,25 +119,37 @@ def test_merge_index_singlekey_inner(self):
119
119
assert_frame_equal (result , expected .loc [:, result .columns ])
120
120
121
121
def test_merge_misspecified (self ):
122
- pytest .raises (ValueError , merge , self .left , self .right ,
123
- left_index = True )
124
- pytest .raises (ValueError , merge , self .left , self .right ,
125
- right_index = True )
126
-
127
- pytest .raises (ValueError , merge , self .left , self .left ,
128
- left_on = 'key' , on = 'key' )
129
-
130
- pytest .raises (ValueError , merge , self .df , self .df2 ,
131
- left_on = ['key1' ], right_on = ['key1' , 'key2' ])
122
+ msg = "Must pass right_on or right_index=True"
123
+ with pytest .raises (pd .errors .MergeError , match = msg ):
124
+ merge (self .left , self .right , left_index = True )
125
+ msg = "Must pass left_on or left_index=True"
126
+ with pytest .raises (pd .errors .MergeError , match = msg ):
127
+ merge (self .left , self .right , right_index = True )
128
+
129
+ msg = ('Can only pass argument "on" OR "left_on" and "right_on", not'
130
+ ' a combination of both' )
131
+ with pytest .raises (pd .errors .MergeError , match = msg ):
132
+ merge (self .left , self .left , left_on = 'key' , on = 'key' )
133
+
134
+ msg = r"len\(right_on\) must equal len\(left_on\)"
135
+ with pytest .raises (ValueError , match = msg ):
136
+ merge (self .df , self .df2 , left_on = ['key1' ],
137
+ right_on = ['key1' , 'key2' ])
132
138
133
139
def test_index_and_on_parameters_confusion (self ):
134
- pytest .raises (ValueError , merge , self .df , self .df2 , how = 'left' ,
135
- left_index = False , right_index = ['key1' , 'key2' ])
136
- pytest .raises (ValueError , merge , self .df , self .df2 , how = 'left' ,
137
- left_index = ['key1' , 'key2' ], right_index = False )
138
- pytest .raises (ValueError , merge , self .df , self .df2 , how = 'left' ,
139
- left_index = ['key1' , 'key2' ],
140
- right_index = ['key1' , 'key2' ])
140
+ msg = ("right_index parameter must be of type bool, not"
141
+ r" <(class|type) 'list'>" )
142
+ with pytest .raises (ValueError , match = msg ):
143
+ merge (self .df , self .df2 , how = 'left' ,
144
+ left_index = False , right_index = ['key1' , 'key2' ])
145
+ msg = ("left_index parameter must be of type bool, not "
146
+ r"<(class|type) 'list'>" )
147
+ with pytest .raises (ValueError , match = msg ):
148
+ merge (self .df , self .df2 , how = 'left' ,
149
+ left_index = ['key1' , 'key2' ], right_index = False )
150
+ with pytest .raises (ValueError , match = msg ):
151
+ merge (self .df , self .df2 , how = 'left' ,
152
+ left_index = ['key1' , 'key2' ], right_index = ['key1' , 'key2' ])
141
153
142
154
def test_merge_overlap (self ):
143
155
merged = merge (self .left , self .left , on = 'key' )
@@ -269,7 +281,6 @@ def test_no_overlap_more_informative_error(self):
269
281
df1 = DataFrame ({'x' : ['a' ]}, index = [dt ])
270
282
271
283
df2 = DataFrame ({'y' : ['b' , 'c' ]}, index = [dt , dt ])
272
- pytest .raises (MergeError , merge , df1 , df2 )
273
284
274
285
msg = ('No common columns to perform merge on. '
275
286
'Merge options: left_on={lon}, right_on={ron}, '
@@ -566,7 +577,10 @@ def test_overlapping_columns_error_message(self):
566
577
567
578
# #2649, #10639
568
579
df2 .columns = ['key1' , 'foo' , 'foo' ]
569
- pytest .raises (ValueError , merge , df , df2 )
580
+ msg = (r"Data columns not unique: Index\(\[u?'foo', u?'foo'\],"
581
+ r" dtype='object'\)" )
582
+ with pytest .raises (MergeError , match = msg ):
583
+ merge (df , df2 )
570
584
571
585
def test_merge_on_datetime64tz (self ):
572
586
@@ -717,9 +731,10 @@ def test_indicator(self):
717
731
assert_frame_equal (test_custom_name , df_result_custom_name )
718
732
719
733
# Check only accepts strings and booleans
720
- with pytest .raises (ValueError ):
734
+ msg = "indicator option can only accept boolean or string arguments"
735
+ with pytest .raises (ValueError , match = msg ):
721
736
merge (df1 , df2 , on = 'col1' , how = 'outer' , indicator = 5 )
722
- with pytest .raises (ValueError ):
737
+ with pytest .raises (ValueError , match = msg ):
723
738
df1 .merge (df2 , on = 'col1' , how = 'outer' , indicator = 5 )
724
739
725
740
# Check result integrity
@@ -743,20 +758,25 @@ def test_indicator(self):
743
758
for i in ['_right_indicator' , '_left_indicator' , '_merge' ]:
744
759
df_badcolumn = DataFrame ({'col1' : [1 , 2 ], i : [2 , 2 ]})
745
760
746
- with pytest .raises (ValueError ):
761
+ msg = ("Cannot use `indicator=True` option when data contains a"
762
+ " column named {}|"
763
+ "Cannot use name of an existing column for indicator"
764
+ " column" ).format (i )
765
+ with pytest .raises (ValueError , match = msg ):
747
766
merge (df1 , df_badcolumn , on = 'col1' ,
748
767
how = 'outer' , indicator = True )
749
- with pytest .raises (ValueError ):
768
+ with pytest .raises (ValueError , match = msg ):
750
769
df1 .merge (df_badcolumn , on = 'col1' , how = 'outer' , indicator = True )
751
770
752
771
# Check for name conflict with custom name
753
772
df_badcolumn = DataFrame (
754
773
{'col1' : [1 , 2 ], 'custom_column_name' : [2 , 2 ]})
755
774
756
- with pytest .raises (ValueError ):
775
+ msg = "Cannot use name of an existing column for indicator column"
776
+ with pytest .raises (ValueError , match = msg ):
757
777
merge (df1 , df_badcolumn , on = 'col1' , how = 'outer' ,
758
778
indicator = 'custom_column_name' )
759
- with pytest .raises (ValueError ):
779
+ with pytest .raises (ValueError , match = msg ):
760
780
df1 .merge (df_badcolumn , on = 'col1' , how = 'outer' ,
761
781
indicator = 'custom_column_name' )
762
782
@@ -843,11 +863,13 @@ def test_validation(self):
843
863
merge (left , right_w_dups , left_index = True , right_index = True ,
844
864
validate = 'one_to_many' )
845
865
846
- with pytest .raises (MergeError ):
866
+ msg = ("Merge keys are not unique in right dataset; not a one-to-one"
867
+ " merge" )
868
+ with pytest .raises (MergeError , match = msg ):
847
869
merge (left , right_w_dups , left_index = True , right_index = True ,
848
870
validate = 'one_to_one' )
849
871
850
- with pytest .raises (MergeError ):
872
+ with pytest .raises (MergeError , match = msg ):
851
873
merge (left , right_w_dups , on = 'a' , validate = 'one_to_one' )
852
874
853
875
# Dups on left
@@ -856,26 +878,33 @@ def test_validation(self):
856
878
merge (left_w_dups , right , left_index = True , right_index = True ,
857
879
validate = 'many_to_one' )
858
880
859
- with pytest .raises (MergeError ):
881
+ msg = ("Merge keys are not unique in left dataset; not a one-to-one"
882
+ " merge" )
883
+ with pytest .raises (MergeError , match = msg ):
860
884
merge (left_w_dups , right , left_index = True , right_index = True ,
861
885
validate = 'one_to_one' )
862
886
863
- with pytest .raises (MergeError ):
887
+ with pytest .raises (MergeError , match = msg ):
864
888
merge (left_w_dups , right , on = 'a' , validate = 'one_to_one' )
865
889
866
890
# Dups on both
867
891
merge (left_w_dups , right_w_dups , on = 'a' , validate = 'many_to_many' )
868
892
869
- with pytest .raises (MergeError ):
893
+ msg = ("Merge keys are not unique in right dataset; not a many-to-one"
894
+ " merge" )
895
+ with pytest .raises (MergeError , match = msg ):
870
896
merge (left_w_dups , right_w_dups , left_index = True ,
871
897
right_index = True , validate = 'many_to_one' )
872
898
873
- with pytest .raises (MergeError ):
899
+ msg = ("Merge keys are not unique in left dataset; not a one-to-many"
900
+ " merge" )
901
+ with pytest .raises (MergeError , match = msg ):
874
902
merge (left_w_dups , right_w_dups , on = 'a' ,
875
903
validate = 'one_to_many' )
876
904
877
905
# Check invalid arguments
878
- with pytest .raises (ValueError ):
906
+ msg = "Not a valid argument for validate"
907
+ with pytest .raises (ValueError , match = msg ):
879
908
merge (left , right , on = 'a' , validate = 'jibberish' )
880
909
881
910
# Two column merge, dups in both, but jointly no dups.
@@ -896,7 +925,9 @@ def test_validation(self):
896
925
'um... weasel noise?' ]},
897
926
index = range (3 ))
898
927
899
- with pytest .raises (MergeError ):
928
+ msg = ("Merge keys are not unique in either left or right dataset;"
929
+ " not a one-to-one merge" )
930
+ with pytest .raises (MergeError , match = msg ):
900
931
merge (left , right , on = 'a' , validate = '1:1' )
901
932
902
933
result = merge (left , right , on = ['a' , 'b' ], validate = '1:1' )
@@ -1439,6 +1470,7 @@ def test_merge_series(on, left_on, right_on, left_index, right_index, nm):
1439
1470
left_index = left_index , right_index = right_index )
1440
1471
tm .assert_frame_equal (result , expected )
1441
1472
else :
1442
- with pytest .raises (ValueError , match = 'a Series without a name' ):
1473
+ msg = "Cannot merge a Series without a name"
1474
+ with pytest .raises (ValueError , match = msg ):
1443
1475
result = pd .merge (a , b , on = on , left_on = left_on , right_on = right_on ,
1444
1476
left_index = left_index , right_index = right_index )
0 commit comments