|
7 | 7 | from pandas.types.generic import ABCDataFrame, ABCPanel, ABCSeries
|
8 | 8 | from pandas.types.common import (is_integer_dtype,
|
9 | 9 | is_integer, is_float,
|
10 |
| - is_categorical_dtype, |
11 | 10 | is_list_like,
|
12 | 11 | is_sequence,
|
13 | 12 | is_iterator,
|
@@ -1087,51 +1086,24 @@ def _getitem_iterable(self, key, axis=0):
|
1087 | 1086 | inds, = key.nonzero()
|
1088 | 1087 | return self.obj.take(inds, axis=axis, convert=False)
|
1089 | 1088 | else:
|
1090 |
| - if isinstance(key, Index): |
1091 |
| - keyarr = labels._convert_index_indexer(key) |
1092 |
| - else: |
1093 |
| - keyarr = _asarray_tuplesafe(key) |
1094 |
| - keyarr = labels._convert_arr_indexer(keyarr) |
1095 |
| - |
1096 |
| - if is_categorical_dtype(labels): |
1097 |
| - keyarr = labels._shallow_copy(keyarr) |
1098 |
| - |
1099 |
| - # have the index handle the indexer and possibly return |
1100 |
| - # an indexer or raising |
1101 |
| - indexer = labels._convert_list_indexer(keyarr, kind=self.name) |
| 1089 | + # Have the index compute an indexer or return None |
| 1090 | + # if it cannot handle |
| 1091 | + indexer, keyarr = labels._convert_listlike_indexer( |
| 1092 | + key, kind=self.name) |
1102 | 1093 | if indexer is not None:
|
1103 | 1094 | return self.obj.take(indexer, axis=axis)
|
1104 | 1095 |
|
1105 |
| - # this is not the most robust, but... |
1106 |
| - if (isinstance(labels, MultiIndex) and len(keyarr) and |
1107 |
| - not isinstance(keyarr[0], tuple)): |
1108 |
| - level = 0 |
1109 |
| - else: |
1110 |
| - level = None |
1111 |
| - |
1112 | 1096 | # existing labels are unique and indexer are unique
|
1113 | 1097 | if labels.is_unique and Index(keyarr).is_unique:
|
1114 | 1098 |
|
1115 | 1099 | try:
|
1116 |
| - result = self.obj.reindex_axis(keyarr, axis=axis, |
1117 |
| - level=level) |
1118 |
| - |
1119 |
| - # this is an error as we are trying to find |
1120 |
| - # keys in a multi-index that don't exist |
1121 |
| - if isinstance(labels, MultiIndex) and level is not None: |
1122 |
| - if (hasattr(result, 'ndim') and |
1123 |
| - not np.prod(result.shape) and len(keyarr)): |
1124 |
| - raise KeyError("cannot index a multi-index axis " |
1125 |
| - "with these keys") |
1126 |
| - |
1127 |
| - return result |
1128 |
| - |
| 1100 | + return self.obj.reindex_axis(keyarr, axis=axis) |
1129 | 1101 | except AttributeError:
|
1130 | 1102 |
|
1131 | 1103 | # Series
|
1132 | 1104 | if axis != 0:
|
1133 | 1105 | raise AssertionError('axis must be 0')
|
1134 |
| - return self.obj.reindex(keyarr, level=level) |
| 1106 | + return self.obj.reindex(keyarr) |
1135 | 1107 |
|
1136 | 1108 | # existing labels are non-unique
|
1137 | 1109 | else:
|
@@ -1225,49 +1197,33 @@ def _convert_to_indexer(self, obj, axis=0, is_setter=False):
|
1225 | 1197 |
|
1226 | 1198 | if is_nested_tuple(obj, labels):
|
1227 | 1199 | return labels.get_locs(obj)
|
| 1200 | + |
1228 | 1201 | elif is_list_like_indexer(obj):
|
| 1202 | + |
1229 | 1203 | if is_bool_indexer(obj):
|
1230 | 1204 | obj = check_bool_indexer(labels, obj)
|
1231 | 1205 | inds, = obj.nonzero()
|
1232 | 1206 | return inds
|
1233 | 1207 | else:
|
1234 |
| - if isinstance(obj, Index): |
1235 |
| - # want Index objects to pass through untouched |
1236 |
| - objarr = obj |
1237 |
| - else: |
1238 |
| - objarr = _asarray_tuplesafe(obj) |
1239 | 1208 |
|
1240 |
| - # The index may want to handle a list indexer differently |
1241 |
| - # by returning an indexer or raising |
1242 |
| - indexer = labels._convert_list_indexer(objarr, kind=self.name) |
| 1209 | + # Have the index compute an indexer or return None |
| 1210 | + # if it cannot handle |
| 1211 | + indexer, objarr = labels._convert_listlike_indexer( |
| 1212 | + obj, kind=self.name) |
1243 | 1213 | if indexer is not None:
|
1244 | 1214 | return indexer
|
1245 | 1215 |
|
1246 |
| - # this is not the most robust, but... |
1247 |
| - if (isinstance(labels, MultiIndex) and |
1248 |
| - not isinstance(objarr[0], tuple)): |
1249 |
| - level = 0 |
1250 |
| - _, indexer = labels.reindex(objarr, level=level) |
| 1216 | + # unique index |
| 1217 | + if labels.is_unique: |
| 1218 | + indexer = check = labels.get_indexer(objarr) |
1251 | 1219 |
|
1252 |
| - # take all |
1253 |
| - if indexer is None: |
1254 |
| - indexer = np.arange(len(labels)) |
1255 |
| - |
1256 |
| - check = labels.levels[0].get_indexer(objarr) |
| 1220 | + # non-unique (dups) |
1257 | 1221 | else:
|
1258 |
| - level = None |
1259 |
| - |
1260 |
| - # unique index |
1261 |
| - if labels.is_unique: |
1262 |
| - indexer = check = labels.get_indexer(objarr) |
1263 |
| - |
1264 |
| - # non-unique (dups) |
1265 |
| - else: |
1266 |
| - (indexer, |
1267 |
| - missing) = labels.get_indexer_non_unique(objarr) |
1268 |
| - # 'indexer' has dupes, create 'check' using 'missing' |
1269 |
| - check = np.zeros_like(objarr) |
1270 |
| - check[missing] = -1 |
| 1222 | + (indexer, |
| 1223 | + missing) = labels.get_indexer_non_unique(objarr) |
| 1224 | + # 'indexer' has dupes, create 'check' using 'missing' |
| 1225 | + check = np.zeros_like(objarr) |
| 1226 | + check[missing] = -1 |
1271 | 1227 |
|
1272 | 1228 | mask = check == -1
|
1273 | 1229 | if mask.any():
|
|
0 commit comments