@@ -1102,19 +1102,24 @@ def intersection(self, other, sort=False):
1102
1102
'objects that have compatible dtypes' )
1103
1103
raise TypeError (msg )
1104
1104
1105
- try :
1105
+ if self . left . is_unique and self . right . is_unique :
1106
1106
lindexer = self .left .get_indexer (other .left )
1107
1107
rindexer = self .right .get_indexer (other .right )
1108
- except Exception :
1108
+ match = (lindexer == rindexer ) & (lindexer != - 1 )
1109
+ indexer = lindexer .take (match .nonzero ()[0 ])
1110
+ taken = self .take (indexer )
1111
+ else :
1109
1112
# duplicates
1110
- lindexer = algos .unique1d (
1111
- self .left .get_indexer_non_unique (other .left )[0 ])
1112
- rindexer = algos .unique1d (
1113
- self .right .get_indexer_non_unique (other .right )[0 ])
1114
-
1115
- match = (lindexer == rindexer ) & (lindexer != - 1 )
1116
- indexer = lindexer .take (match .nonzero ()[0 ])
1117
- taken = self .take (indexer )
1113
+ lmiss = other .left .get_indexer_non_unique (self .left )[1 ]
1114
+ lindexer = np .setdiff1d (np .arange (len (self )), lmiss )
1115
+ rmiss = other .right .get_indexer_non_unique (self .right )[1 ]
1116
+ rindexer = np .setdiff1d (np .arange (len (self )), rmiss )
1117
+ indexer = np .intersect1d (lindexer , rindexer )
1118
+ taken = self [indexer ]
1119
+
1120
+ #match = (lindexer == rindexer) & (lindexer != -1)
1121
+ #indexer = lindexer.take(match.nonzero()[0])
1122
+ #taken = self.take(indexer)
1118
1123
1119
1124
if sort is None :
1120
1125
taken = taken .sort_values ()
0 commit comments