Skip to content

Commit 86ef3ca

Browse files
authored
DOC: use shared_docs for Index.get_indexer, get_indexer_non_unique (pandas-dev#15411)
* STYLE: flake8 upgraded to 3.3 on conda fixes for E305, 2 blank lines after a class definition * DOC: use shared_docs for Index.get_indexer, get_indexer_non_unique fix non-populated doc-strings for some methods in Index (take)
1 parent 93f5e3a commit 86ef3ca

File tree

4 files changed

+55
-71
lines changed

4 files changed

+55
-71
lines changed

pandas/indexes/base.py

+32-9
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
_unsortable_types = frozenset(('mixed', 'mixed-integer'))
6666

6767
_index_doc_kwargs = dict(klass='Index', inplace='',
68+
target_klass='Index',
6869
unique='Index', duplicated='np.ndarray')
6970
_index_shared_docs = dict()
7071

@@ -1605,7 +1606,7 @@ def _append_same_dtype(self, to_concat, name):
16051606
numpy.ndarray.take
16061607
"""
16071608

1608-
@Appender(_index_shared_docs['take'])
1609+
@Appender(_index_shared_docs['take'] % _index_doc_kwargs)
16091610
def take(self, indices, axis=0, allow_fill=True,
16101611
fill_value=None, **kwargs):
16111612
nv.validate_take(tuple(), kwargs)
@@ -2350,15 +2351,14 @@ def get_level_values(self, level):
23502351
self._validate_index_level(level)
23512352
return self
23522353

2353-
def get_indexer(self, target, method=None, limit=None, tolerance=None):
2354-
"""
2354+
_index_shared_docs['get_indexer'] = """
23552355
Compute indexer and mask for new index given the current index. The
23562356
indexer should be then used as an input to ndarray.take to align the
23572357
current data to the new index.
23582358
23592359
Parameters
23602360
----------
2361-
target : Index
2361+
target : %(target_klass)s
23622362
method : {None, 'pad'/'ffill', 'backfill'/'bfill', 'nearest'}, optional
23632363
* default: exact matches only.
23642364
* pad / ffill: find the PREVIOUS index value if no exact match.
@@ -2387,6 +2387,9 @@ def get_indexer(self, target, method=None, limit=None, tolerance=None):
23872387
positions matches the corresponding target values. Missing values
23882388
in the target are marked by -1.
23892389
"""
2390+
2391+
@Appender(_index_shared_docs['get_indexer'] % _index_doc_kwargs)
2392+
def get_indexer(self, target, method=None, limit=None, tolerance=None):
23902393
method = missing.clean_reindex_fill_method(method)
23912394
target = _ensure_index(target)
23922395
if tolerance is not None:
@@ -2496,11 +2499,28 @@ def _filter_indexer_tolerance(self, target, indexer, tolerance):
24962499
indexer = np.where(distance <= tolerance, indexer, -1)
24972500
return indexer
24982501

2502+
_index_shared_docs['get_indexer_non_unique'] = """
2503+
Compute indexer and mask for new index given the current index. The
2504+
indexer should be then used as an input to ndarray.take to align the
2505+
current data to the new index.
2506+
2507+
Parameters
2508+
----------
2509+
target : %(target_klass)s
2510+
2511+
Returns
2512+
-------
2513+
indexer : ndarray of int
2514+
Integers from 0 to n - 1 indicating that the index at these
2515+
positions matches the corresponding target values. Missing values
2516+
in the target are marked by -1.
2517+
missing : ndarray of int
2518+
An indexer into the target of the values not found.
2519+
These correspond to the -1 in the indexer array
2520+
"""
2521+
2522+
@Appender(_index_shared_docs['get_indexer_non_unique'] % _index_doc_kwargs)
24992523
def get_indexer_non_unique(self, target):
2500-
""" return an indexer suitable for taking from a non unique index
2501-
return the labels in the same order as the target, and
2502-
return a missing indexer into the target (missing are marked as -1
2503-
in the indexer); target must be an iterable """
25042524
target = _ensure_index(target)
25052525
pself, ptarget = self._possibly_promote(target)
25062526
if pself is not self or ptarget is not target:
@@ -2516,7 +2536,10 @@ def get_indexer_non_unique(self, target):
25162536
return Index(indexer), missing
25172537

25182538
def get_indexer_for(self, target, **kwargs):
2519-
""" guaranteed return of an indexer even when non-unique """
2539+
"""
2540+
guaranteed return of an indexer even when non-unique
2541+
This dispatches to get_indexer or get_indexer_nonunique as appropriate
2542+
"""
25202543
if self.is_unique:
25212544
return self.get_indexer(target, **kwargs)
25222545
indexer, _ = self.get_indexer_non_unique(target, **kwargs)

pandas/indexes/category.py

+7-33
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
import pandas.core.base as base
1919
import pandas.core.missing as missing
2020
import pandas.indexes.base as ibase
21+
_index_doc_kwargs = dict(ibase._index_doc_kwargs)
22+
_index_doc_kwargs.update(dict(target_klass='CategoricalIndex'))
2123

2224

2325
class CategoricalIndex(Index, base.PandasDelegate):
@@ -289,7 +291,7 @@ def _engine(self):
289291
def is_unique(self):
290292
return not self.duplicated().any()
291293

292-
@Appender(base._shared_docs['unique'] % ibase._index_doc_kwargs)
294+
@Appender(base._shared_docs['unique'] % _index_doc_kwargs)
293295
def unique(self):
294296
result = base.IndexOpsMixin.unique(self)
295297
# CategoricalIndex._shallow_copy uses keeps original categories
@@ -299,7 +301,7 @@ def unique(self):
299301

300302
@deprecate_kwarg('take_last', 'keep', mapping={True: 'last',
301303
False: 'first'})
302-
@Appender(base._shared_docs['duplicated'] % ibase._index_doc_kwargs)
304+
@Appender(base._shared_docs['duplicated'] % _index_doc_kwargs)
303305
def duplicated(self, keep='first'):
304306
from pandas.hashtable import duplicated_int64
305307
codes = self.codes.astype('i8')
@@ -425,34 +427,8 @@ def _reindex_non_unique(self, target):
425427

426428
return new_target, indexer, new_indexer
427429

430+
@Appender(_index_shared_docs['get_indexer'] % _index_doc_kwargs)
428431
def get_indexer(self, target, method=None, limit=None, tolerance=None):
429-
"""
430-
Compute indexer and mask for new index given the current index. The
431-
indexer should be then used as an input to ndarray.take to align the
432-
current data to the new index. The mask determines whether labels are
433-
found or not in the current index
434-
435-
Parameters
436-
----------
437-
target : MultiIndex or Index (of tuples)
438-
method : {'pad', 'ffill', 'backfill', 'bfill'}
439-
pad / ffill: propagate LAST valid observation forward to next valid
440-
backfill / bfill: use NEXT valid observation to fill gap
441-
442-
Notes
443-
-----
444-
This is a low-level method and probably should be used at your own risk
445-
446-
Examples
447-
--------
448-
>>> indexer, mask = index.get_indexer(new_index)
449-
>>> new_values = cur_values.take(indexer)
450-
>>> new_values[-mask] = np.nan
451-
452-
Returns
453-
-------
454-
(indexer, mask) : (ndarray, ndarray)
455-
"""
456432
method = missing.clean_reindex_fill_method(method)
457433
target = ibase._ensure_index(target)
458434

@@ -472,10 +448,8 @@ def get_indexer(self, target, method=None, limit=None, tolerance=None):
472448

473449
return _ensure_platform_int(indexer)
474450

451+
@Appender(_index_shared_docs['get_indexer_non_unique'] % _index_doc_kwargs)
475452
def get_indexer_non_unique(self, target):
476-
""" this is the same for a CategoricalIndex for get_indexer; the API
477-
returns the missing values as well
478-
"""
479453
target = ibase._ensure_index(target)
480454

481455
if isinstance(target, CategoricalIndex):
@@ -497,7 +471,7 @@ def _convert_list_indexer(self, keyarr, kind=None):
497471

498472
return None
499473

500-
@Appender(_index_shared_docs['take'])
474+
@Appender(_index_shared_docs['take'] % _index_doc_kwargs)
501475
def take(self, indices, axis=0, allow_fill=True,
502476
fill_value=None, **kwargs):
503477
nv.validate_take(tuple(), kwargs)

pandas/indexes/multi.py

+11-29
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@
4343
_get_na_value, InvalidIndexError,
4444
_index_shared_docs)
4545
import pandas.indexes.base as ibase
46+
_index_doc_kwargs = dict(ibase._index_doc_kwargs)
47+
_index_doc_kwargs.update(
48+
dict(klass='MultiIndex',
49+
target_klass='MultiIndex or list of tuples'))
4650

4751

4852
class MultiIndex(Index):
@@ -755,7 +759,7 @@ def f(k, stringify):
755759

756760
@deprecate_kwarg('take_last', 'keep', mapping={True: 'last',
757761
False: 'first'})
758-
@Appender(base._shared_docs['duplicated'] % ibase._index_doc_kwargs)
762+
@Appender(base._shared_docs['duplicated'] % _index_doc_kwargs)
759763
def duplicated(self, keep='first'):
760764
from pandas.core.sorting import get_group_index
761765
from pandas.hashtable import duplicated_int64
@@ -1244,7 +1248,7 @@ def __getitem__(self, key):
12441248
names=self.names, sortorder=sortorder,
12451249
verify_integrity=False)
12461250

1247-
@Appender(_index_shared_docs['take'])
1251+
@Appender(_index_shared_docs['take'] % _index_doc_kwargs)
12481252
def take(self, indices, axis=0, allow_fill=True,
12491253
fill_value=None, **kwargs):
12501254
nv.validate_take(tuple(), kwargs)
@@ -1564,34 +1568,8 @@ def sortlevel(self, level=0, ascending=True, sort_remaining=True):
15641568

15651569
return new_index, indexer
15661570

1571+
@Appender(_index_shared_docs['get_indexer'] % _index_doc_kwargs)
15671572
def get_indexer(self, target, method=None, limit=None, tolerance=None):
1568-
"""
1569-
Compute indexer and mask for new index given the current index. The
1570-
indexer should be then used as an input to ndarray.take to align the
1571-
current data to the new index. The mask determines whether labels are
1572-
found or not in the current index
1573-
1574-
Parameters
1575-
----------
1576-
target : MultiIndex or Index (of tuples)
1577-
method : {'pad', 'ffill', 'backfill', 'bfill'}
1578-
pad / ffill: propagate LAST valid observation forward to next valid
1579-
backfill / bfill: use NEXT valid observation to fill gap
1580-
1581-
Notes
1582-
-----
1583-
This is a low-level method and probably should be used at your own risk
1584-
1585-
Examples
1586-
--------
1587-
>>> indexer, mask = index.get_indexer(new_index)
1588-
>>> new_values = cur_values.take(indexer)
1589-
>>> new_values[-mask] = np.nan
1590-
1591-
Returns
1592-
-------
1593-
(indexer, mask) : (ndarray, ndarray)
1594-
"""
15951573
method = missing.clean_reindex_fill_method(method)
15961574
target = _ensure_index(target)
15971575

@@ -1633,6 +1611,10 @@ def get_indexer(self, target, method=None, limit=None, tolerance=None):
16331611

16341612
return _ensure_platform_int(indexer)
16351613

1614+
@Appender(_index_shared_docs['get_indexer_non_unique'] % _index_doc_kwargs)
1615+
def get_indexer_non_unique(self, target):
1616+
return super(MultiIndex, self).get_indexer_non_unique(target)
1617+
16361618
def reindex(self, target, method=None, level=None, limit=None,
16371619
tolerance=None):
16381620
"""

pandas/tseries/period.py

+5
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@
4444
from pandas.lib import infer_dtype
4545
import pandas.tslib as tslib
4646
from pandas.compat import zip, u
47+
import pandas.indexes.base as ibase
48+
_index_doc_kwargs = dict(ibase._index_doc_kwargs)
49+
_index_doc_kwargs.update(
50+
dict(target_klass='PeriodIndex or list of Periods'))
4751

4852

4953
def _field_accessor(name, alias, docstring=None):
@@ -759,6 +763,7 @@ def get_value(self, series, key):
759763
return com._maybe_box(self, self._engine.get_value(s, key),
760764
series, key)
761765

766+
@Appender(_index_shared_docs['get_indexer'] % _index_doc_kwargs)
762767
def get_indexer(self, target, method=None, limit=None, tolerance=None):
763768
target = _ensure_index(target)
764769

0 commit comments

Comments
 (0)