DOC: use shared docs on Index._convert_list_indexer (#15678) · pandas-dev/pandas@05d70f4 (original) (raw)
`@@ -7,7 +7,6 @@
`
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():
`