@@ -505,9 +505,8 @@ def _get_attributes_dict(self):
505
505
"""
506
506
return {k : getattr (self , k , None ) for k in self ._attributes }
507
507
508
- _index_shared_docs [
509
- "_shallow_copy"
510
- ] = """
508
+ def _shallow_copy (self , values = None , ** kwargs ):
509
+ """
511
510
Create a new Index with the same class as the caller, don't copy the
512
511
data, use the same object attributes with passed in attributes taking
513
512
precedence.
@@ -519,9 +518,6 @@ def _get_attributes_dict(self):
519
518
values : the values to create the new Index, optional
520
519
kwargs : updates the default attributes for this Index
521
520
"""
522
-
523
- @Appender (_index_shared_docs ["_shallow_copy" ])
524
- def _shallow_copy (self , values = None , ** kwargs ):
525
521
if values is None :
526
522
values = self .values
527
523
@@ -659,9 +655,8 @@ def view(self, cls=None):
659
655
result ._id = self ._id
660
656
return result
661
657
662
- _index_shared_docs [
663
- "astype"
664
- ] = """
658
+ def astype (self , dtype , copy = True ):
659
+ """
665
660
Create an Index with values cast to dtypes. The class of a new Index
666
661
is determined by dtype. When conversion is impossible, a ValueError
667
662
exception is raised.
@@ -683,9 +678,6 @@ def view(self, cls=None):
683
678
Index
684
679
Index with values cast to specified dtype.
685
680
"""
686
-
687
- @Appender (_index_shared_docs ["astype" ])
688
- def astype (self , dtype , copy = True ):
689
681
if is_dtype_equal (self .dtype , dtype ):
690
682
return self .copy () if copy else self
691
683
@@ -823,9 +815,8 @@ def repeat(self, repeats, axis=None):
823
815
# --------------------------------------------------------------------
824
816
# Copying Methods
825
817
826
- _index_shared_docs [
827
- "copy"
828
- ] = """
818
+ def copy (self , name = None , deep = False , dtype = None , ** kwargs ):
819
+ """
829
820
Make a copy of this object. Name and dtype sets those attributes on
830
821
the new object.
831
822
@@ -844,9 +835,6 @@ def repeat(self, repeats, axis=None):
844
835
In most cases, there should be no functional difference from using
845
836
``deep``, but if ``deep`` is passed it will attempt to deepcopy.
846
837
"""
847
-
848
- @Appender (_index_shared_docs ["copy" ])
849
- def copy (self , name = None , deep = False , dtype = None , ** kwargs ):
850
838
if deep :
851
839
new_index = self ._shallow_copy (self ._data .copy ())
852
840
else :
@@ -1537,9 +1525,8 @@ def droplevel(self, level=0):
1537
1525
verify_integrity = False ,
1538
1526
)
1539
1527
1540
- _index_shared_docs [
1541
- "_get_grouper_for_level"
1542
- ] = """
1528
+ def _get_grouper_for_level (self , mapper , level = None ):
1529
+ """
1543
1530
Get index grouper corresponding to an index level
1544
1531
1545
1532
Parameters
@@ -1558,9 +1545,6 @@ def droplevel(self, level=0):
1558
1545
uniques : Index or None
1559
1546
Index of unique values for level.
1560
1547
"""
1561
-
1562
- @Appender (_index_shared_docs ["_get_grouper_for_level" ])
1563
- def _get_grouper_for_level (self , mapper , level = None ):
1564
1548
assert level is None or level == 0
1565
1549
if mapper is None :
1566
1550
grouper = self
@@ -2156,9 +2140,8 @@ def notna(self):
2156
2140
2157
2141
notnull = notna
2158
2142
2159
- _index_shared_docs [
2160
- "fillna"
2161
- ] = """
2143
+ def fillna (self , value = None , downcast = None ):
2144
+ """
2162
2145
Fill NA/NaN values with the specified value.
2163
2146
2164
2147
Parameters
@@ -2175,9 +2158,6 @@ def notna(self):
2175
2158
-------
2176
2159
filled : Index
2177
2160
"""
2178
-
2179
- @Appender (_index_shared_docs ["fillna" ])
2180
- def fillna (self , value = None , downcast = None ):
2181
2161
self ._assert_can_do_op (value )
2182
2162
if self .hasnans :
2183
2163
result = self .putmask (self ._isnan , value )
@@ -2187,9 +2167,8 @@ def fillna(self, value=None, downcast=None):
2187
2167
return Index (result , name = self .name )
2188
2168
return self ._shallow_copy ()
2189
2169
2190
- _index_shared_docs [
2191
- "dropna"
2192
- ] = """
2170
+ def dropna (self , how = "any" ):
2171
+ """
2193
2172
Return Index without NA/NaN values.
2194
2173
2195
2174
Parameters
@@ -2202,9 +2181,6 @@ def fillna(self, value=None, downcast=None):
2202
2181
-------
2203
2182
valid : Index
2204
2183
"""
2205
-
2206
- @Appender (_index_shared_docs ["dropna" ])
2207
- def dropna (self , how = "any" ):
2208
2184
if how not in ("any" , "all" ):
2209
2185
raise ValueError (f"invalid how option: { how } " )
2210
2186
@@ -2215,9 +2191,8 @@ def dropna(self, how="any"):
2215
2191
# --------------------------------------------------------------------
2216
2192
# Uniqueness Methods
2217
2193
2218
- _index_shared_docs [
2219
- "index_unique"
2220
- ] = """
2194
+ def unique (self , level = None ):
2195
+ """
2221
2196
Return unique values in the index. Uniques are returned in order
2222
2197
of appearance, this does NOT sort.
2223
2198
@@ -2237,9 +2212,6 @@ def dropna(self, how="any"):
2237
2212
unique
2238
2213
Series.unique
2239
2214
"""
2240
-
2241
- @Appender (_index_shared_docs ["index_unique" ] % _index_doc_kwargs )
2242
- def unique (self , level = None ):
2243
2215
if level is not None :
2244
2216
self ._validate_index_level (level )
2245
2217
result = super ().unique ()
@@ -2625,9 +2597,9 @@ def _union(self, other, sort):
2625
2597
def _wrap_setop_result (self , other , result ):
2626
2598
return self ._constructor (result , name = get_op_result_name (self , other ))
2627
2599
2628
- _index_shared_docs [
2629
- "intersection"
2630
- ] = """
2600
+ # TODO: standardize return type of non-union setops type(self vs other)
2601
+ def intersection ( self , other , sort = False ):
2602
+ """
2631
2603
Form the intersection of two Index objects.
2632
2604
2633
2605
This returns a new Index with elements common to the index and `other`.
@@ -2661,10 +2633,6 @@ def _wrap_setop_result(self, other, result):
2661
2633
>>> idx1.intersection(idx2)
2662
2634
Int64Index([3, 4], dtype='int64')
2663
2635
"""
2664
-
2665
- # TODO: standardize return type of non-union setops type(self vs other)
2666
- @Appender (_index_shared_docs ["intersection" ])
2667
- def intersection (self , other , sort = False ):
2668
2636
self ._validate_sort_keyword (sort )
2669
2637
self ._assert_can_do_setop (other )
2670
2638
other = ensure_index (other )
@@ -2868,9 +2836,8 @@ def _convert_can_do_setop(self, other):
2868
2836
# --------------------------------------------------------------------
2869
2837
# Indexing Methods
2870
2838
2871
- _index_shared_docs [
2872
- "get_loc"
2873
- ] = """
2839
+ def get_loc (self , key , method = None , tolerance = None ):
2840
+ """
2874
2841
Get integer location, slice or boolean mask for requested label.
2875
2842
2876
2843
Parameters
@@ -2907,9 +2874,6 @@ def _convert_can_do_setop(self, other):
2907
2874
>>> non_monotonic_index.get_loc('b')
2908
2875
array([False, True, False, True], dtype=bool)
2909
2876
"""
2910
-
2911
- @Appender (_index_shared_docs ["get_loc" ])
2912
- def get_loc (self , key , method = None , tolerance = None ):
2913
2877
if method is None :
2914
2878
if tolerance is not None :
2915
2879
raise ValueError (
@@ -3121,19 +3085,15 @@ def _filter_indexer_tolerance(
3121
3085
# --------------------------------------------------------------------
3122
3086
# Indexer Conversion Methods
3123
3087
3124
- _index_shared_docs [
3125
- "_convert_scalar_indexer"
3126
- ] = """
3088
+ def _convert_scalar_indexer (self , key , kind = None ):
3089
+ """
3127
3090
Convert a scalar indexer.
3128
3091
3129
3092
Parameters
3130
3093
----------
3131
3094
key : label of the slice bound
3132
3095
kind : {'loc', 'getitem', 'iloc'} or None
3133
- """
3134
-
3135
- @Appender (_index_shared_docs ["_convert_scalar_indexer" ])
3136
- def _convert_scalar_indexer (self , key , kind = None ):
3096
+ """
3137
3097
assert kind in ["loc" , "getitem" , "iloc" , None ]
3138
3098
3139
3099
if kind == "iloc" :
@@ -3171,9 +3131,8 @@ def _convert_scalar_indexer(self, key, kind=None):
3171
3131
3172
3132
return key
3173
3133
3174
- _index_shared_docs [
3175
- "_convert_slice_indexer"
3176
- ] = """
3134
+ def _convert_slice_indexer (self , key : slice , kind = None ):
3135
+ """
3177
3136
Convert a slice indexer.
3178
3137
3179
3138
By definition, these are labels unless 'iloc' is passed in.
@@ -3183,10 +3142,7 @@ def _convert_scalar_indexer(self, key, kind=None):
3183
3142
----------
3184
3143
key : label of the slice bound
3185
3144
kind : {'loc', 'getitem', 'iloc'} or None
3186
- """
3187
-
3188
- @Appender (_index_shared_docs ["_convert_slice_indexer" ])
3189
- def _convert_slice_indexer (self , key : slice , kind = None ):
3145
+ """
3190
3146
assert kind in ["loc" , "getitem" , "iloc" , None ]
3191
3147
3192
3148
# validate iloc
@@ -3266,9 +3222,8 @@ def _convert_listlike_indexer(self, keyarr, kind=None):
3266
3222
indexer = self ._convert_list_indexer (keyarr , kind = kind )
3267
3223
return indexer , keyarr
3268
3224
3269
- _index_shared_docs [
3270
- "_convert_arr_indexer"
3271
- ] = """
3225
+ def _convert_arr_indexer (self , keyarr ):
3226
+ """
3272
3227
Convert an array-like indexer to the appropriate dtype.
3273
3228
3274
3229
Parameters
@@ -3279,16 +3234,12 @@ def _convert_listlike_indexer(self, keyarr, kind=None):
3279
3234
Returns
3280
3235
-------
3281
3236
converted_keyarr : array-like
3282
- """
3283
-
3284
- @Appender (_index_shared_docs ["_convert_arr_indexer" ])
3285
- def _convert_arr_indexer (self , keyarr ):
3237
+ """
3286
3238
keyarr = com .asarray_tuplesafe (keyarr )
3287
3239
return keyarr
3288
3240
3289
- _index_shared_docs [
3290
- "_convert_index_indexer"
3291
- ] = """
3241
+ def _convert_index_indexer (self , keyarr ):
3242
+ """
3292
3243
Convert an Index indexer to the appropriate dtype.
3293
3244
3294
3245
Parameters
@@ -3299,15 +3250,11 @@ def _convert_arr_indexer(self, keyarr):
3299
3250
Returns
3300
3251
-------
3301
3252
converted_keyarr : Index (or sub-class)
3302
- """
3303
-
3304
- @Appender (_index_shared_docs ["_convert_index_indexer" ])
3305
- def _convert_index_indexer (self , keyarr ):
3253
+ """
3306
3254
return keyarr
3307
3255
3308
- _index_shared_docs [
3309
- "_convert_list_indexer"
3310
- ] = """
3256
+ def _convert_list_indexer (self , keyarr , kind = None ):
3257
+ """
3311
3258
Convert a list-like indexer to the appropriate dtype.
3312
3259
3313
3260
Parameters
@@ -3319,10 +3266,7 @@ def _convert_index_indexer(self, keyarr):
3319
3266
Returns
3320
3267
-------
3321
3268
positional indexer or None
3322
- """
3323
-
3324
- @Appender (_index_shared_docs ["_convert_list_indexer" ])
3325
- def _convert_list_indexer (self , keyarr , kind = None ):
3269
+ """
3326
3270
if (
3327
3271
kind in [None , "iloc" ]
3328
3272
and is_integer_dtype (keyarr )
@@ -3502,9 +3446,8 @@ def _reindex_non_unique(self, target):
3502
3446
# --------------------------------------------------------------------
3503
3447
# Join Methods
3504
3448
3505
- _index_shared_docs [
3506
- "join"
3507
- ] = """
3449
+ def join (self , other , how = "left" , level = None , return_indexers = False , sort = False ):
3450
+ """
3508
3451
Compute join_index and indexers to conform data
3509
3452
structures to the new index.
3510
3453
@@ -3522,9 +3465,6 @@ def _reindex_non_unique(self, target):
3522
3465
-------
3523
3466
join_index, (left_indexer, right_indexer)
3524
3467
"""
3525
-
3526
- @Appender (_index_shared_docs ["join" ])
3527
- def join (self , other , how = "left" , level = None , return_indexers = False , sort = False ):
3528
3468
self_is_mi = isinstance (self , ABCMultiIndex )
3529
3469
other_is_mi = isinstance (other , ABCMultiIndex )
3530
3470
@@ -4033,9 +3973,8 @@ def memory_usage(self, deep: bool = False) -> int:
4033
3973
result += self ._engine .sizeof (deep = deep )
4034
3974
return result
4035
3975
4036
- _index_shared_docs [
4037
- "where"
4038
- ] = """
3976
+ def where (self , cond , other = None ):
3977
+ """
4039
3978
Return an Index of same shape as self and whose corresponding
4040
3979
entries are from self where cond is True and otherwise are from
4041
3980
other.
@@ -4049,9 +3988,6 @@ def memory_usage(self, deep: bool = False) -> int:
4049
3988
-------
4050
3989
Index
4051
3990
"""
4052
-
4053
- @Appender (_index_shared_docs ["where" ])
4054
- def where (self , cond , other = None ):
4055
3991
if other is None :
4056
3992
other = self ._na_value
4057
3993
@@ -4146,9 +4082,8 @@ def is_type_compatible(self, kind) -> bool:
4146
4082
"""
4147
4083
return kind == self .inferred_type
4148
4084
4149
- _index_shared_docs [
4150
- "contains"
4151
- ] = """
4085
+ def __contains__ (self , key : Any ) -> bool :
4086
+ """
4152
4087
Return a boolean indicating whether the provided key is in the index.
4153
4088
4154
4089
Parameters
@@ -4177,9 +4112,6 @@ def is_type_compatible(self, kind) -> bool:
4177
4112
>>> 6 in idx
4178
4113
False
4179
4114
"""
4180
-
4181
- @Appender (_index_shared_docs ["contains" ] % _index_doc_kwargs )
4182
- def __contains__ (self , key : Any ) -> bool :
4183
4115
hash (key )
4184
4116
try :
4185
4117
return key in self ._engine
@@ -5020,9 +4952,8 @@ def _validate_indexer(self, form: str_t, key, kind: str_t):
5020
4952
else :
5021
4953
self ._invalid_indexer (form , key )
5022
4954
5023
- _index_shared_docs [
5024
- "_maybe_cast_slice_bound"
5025
- ] = """
4955
+ def _maybe_cast_slice_bound (self , label , side : str_t , kind ):
4956
+ """
5026
4957
This function should be overloaded in subclasses that allow non-trivial
5027
4958
casting on label-slice bounds, e.g. datetime-like indices allowing
5028
4959
strings containing formatted datetimes.
@@ -5041,9 +4972,6 @@ def _validate_indexer(self, form: str_t, key, kind: str_t):
5041
4972
-----
5042
4973
Value of `side` parameter should be validated in caller.
5043
4974
"""
5044
-
5045
- @Appender (_index_shared_docs ["_maybe_cast_slice_bound" ])
5046
- def _maybe_cast_slice_bound (self , label , side : str_t , kind ):
5047
4975
assert kind in ["loc" , "getitem" , None ]
5048
4976
5049
4977
# We are a plain index here (sub-class override this method if they
0 commit comments