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():

`