@@ -902,30 +902,45 @@ def _getitem_tuple(self, tup):
902
902
return retval
903
903
904
904
def _multi_take_opportunity (self , tup ):
905
- from pandas .core .generic import NDFrame
905
+ """
906
+ Check whether there is the possibility to use ``_multi_take``.
907
+ Currently the limit is that all axes being indexed must be indexed with
908
+ list-likes.
906
909
907
- # ugly hack for GH #836
908
- if not isinstance (self .obj , NDFrame ):
909
- return False
910
+ Parameters
911
+ ----------
912
+ tup : tuple
913
+ Tuple of indexers, one per axis
910
914
915
+ Returns
916
+ -------
917
+ boolean: Whether the current indexing can be passed through _multi_take
918
+ """
911
919
if not all (is_list_like_indexer (x ) for x in tup ):
912
920
return False
913
921
914
922
# just too complicated
915
- for indexer , ax in zip (tup , self .obj ._data .axes ):
916
- if isinstance (ax , MultiIndex ):
917
- return False
918
- elif com .is_bool_indexer (indexer ):
919
- return False
920
- elif not ax .is_unique :
921
- return False
923
+ if any (com .is_bool_indexer (x ) for x in tup ):
924
+ return False
922
925
923
926
return True
924
927
925
928
def _multi_take (self , tup ):
926
- """ create the reindex map for our objects, raise the _exception if we
927
- can't create the indexer
928
929
"""
930
+ Create the indexers for the passed tuple of keys, and execute the take
931
+ operation. This allows the take operation to be executed all at once -
932
+ rather than once for each dimension - improving efficiency.
933
+
934
+ Parameters
935
+ ----------
936
+ tup : tuple
937
+ Tuple of indexers, one per axis
938
+
939
+ Returns
940
+ -------
941
+ values: same type as the object being indexed
942
+ """
943
+ # GH 836
929
944
o = self .obj
930
945
d = {axis : self ._get_listlike_indexer (key , axis )
931
946
for (key , axis ) in zip (tup , o ._AXIS_ORDERS )}
0 commit comments