Skip to content

Commit 63c76a5

Browse files
Moons08datapythonista
authored andcommitted
DOC: Update docstring of Index.set_names (#22363)
1 parent 8bb2cc1 commit 63c76a5

File tree

2 files changed

+76
-32
lines changed

2 files changed

+76
-32
lines changed

pandas/core/indexes/base.py

+75-31
Original file line numberDiff line numberDiff line change
@@ -1278,39 +1278,52 @@ def _set_names(self, values, level=None):
12781278

12791279
def set_names(self, names, level=None, inplace=False):
12801280
"""
1281-
Set new names on index. Defaults to returning new index.
1281+
Set Index or MultiIndex name.
1282+
1283+
Able to set new names partially and by level.
12821284
12831285
Parameters
12841286
----------
1285-
names : str or sequence
1286-
name(s) to set
1287-
level : int, level name, or sequence of int/level names (default None)
1288-
If the index is a MultiIndex (hierarchical), level(s) to set (None
1289-
for all levels). Otherwise level must be None
1290-
inplace : bool
1291-
if True, mutates in place
1287+
names : label or list of label
1288+
Name(s) to set.
1289+
level : int, label or list of int or label, optional
1290+
If the index is a MultiIndex, level(s) to set (None for all
1291+
levels). Otherwise level must be None.
1292+
inplace : bool, default False
1293+
Modifies the object directly, instead of creating a new Index or
1294+
MultiIndex.
12921295
12931296
Returns
12941297
-------
1295-
new index (of same type and class...etc) [if inplace, returns None]
1298+
Index
1299+
The same type as the caller or None if inplace is True.
1300+
1301+
See Also
1302+
--------
1303+
Index.rename : Able to set new names without level.
12961304
12971305
Examples
12981306
--------
1299-
>>> pd.Index([1, 2, 3, 4]).set_names('foo')
1300-
Int64Index([1, 2, 3, 4], dtype='int64', name='foo')
1301-
>>> pd.Index([1, 2, 3, 4]).set_names(['foo'])
1302-
Int64Index([1, 2, 3, 4], dtype='int64', name='foo')
1303-
>>> idx = pd.MultiIndex.from_tuples([(1, u'one'), (1, u'two'),
1304-
(2, u'one'), (2, u'two')],
1305-
names=['foo', 'bar'])
1306-
>>> idx.set_names(['baz', 'quz'])
1307-
MultiIndex(levels=[[1, 2], [u'one', u'two']],
1308-
labels=[[0, 0, 1, 1], [0, 1, 0, 1]],
1309-
names=[u'baz', u'quz'])
1310-
>>> idx.set_names('baz', level=0)
1311-
MultiIndex(levels=[[1, 2], [u'one', u'two']],
1312-
labels=[[0, 0, 1, 1], [0, 1, 0, 1]],
1313-
names=[u'baz', u'bar'])
1307+
>>> idx = pd.Index([1, 2, 3, 4])
1308+
>>> idx
1309+
Int64Index([1, 2, 3, 4], dtype='int64')
1310+
>>> idx.set_names('quarter')
1311+
Int64Index([1, 2, 3, 4], dtype='int64', name='quarter')
1312+
1313+
>>> idx = pd.MultiIndex.from_product([['python', 'cobra'],
1314+
... [2018, 2019]])
1315+
>>> idx
1316+
MultiIndex(levels=[['cobra', 'python'], [2018, 2019]],
1317+
labels=[[1, 1, 0, 0], [0, 1, 0, 1]])
1318+
>>> idx.set_names(['kind', 'year'], inplace=True)
1319+
>>> idx
1320+
MultiIndex(levels=[['cobra', 'python'], [2018, 2019]],
1321+
labels=[[1, 1, 0, 0], [0, 1, 0, 1]],
1322+
names=['kind', 'year'])
1323+
>>> idx.set_names('species', level=0)
1324+
MultiIndex(levels=[['cobra', 'python'], [2018, 2019]],
1325+
labels=[[1, 1, 0, 0], [0, 1, 0, 1]],
1326+
names=['species', 'year'])
13141327
"""
13151328

13161329
from .multi import MultiIndex
@@ -1319,7 +1332,8 @@ def set_names(self, names, level=None, inplace=False):
13191332

13201333
if level is not None and not is_list_like(level) and is_list_like(
13211334
names):
1322-
raise TypeError("Names must be a string")
1335+
msg = "Names must be a string when a single level is provided."
1336+
raise TypeError(msg)
13231337

13241338
if not is_list_like(names) and level is None and self.nlevels > 1:
13251339
raise TypeError("Must pass list-like as `names`.")
@@ -1339,18 +1353,48 @@ def set_names(self, names, level=None, inplace=False):
13391353

13401354
def rename(self, name, inplace=False):
13411355
"""
1342-
Set new names on index. Defaults to returning new index.
1356+
Alter Index or MultiIndex name.
1357+
1358+
Able to set new names without level. Defaults to returning new index.
1359+
Length of names must match number of levels in MultiIndex.
13431360
13441361
Parameters
13451362
----------
1346-
name : str or list
1347-
name to set
1348-
inplace : bool
1349-
if True, mutates in place
1363+
name : label or list of labels
1364+
Name(s) to set.
1365+
inplace : boolean, default False
1366+
Modifies the object directly, instead of creating a new Index or
1367+
MultiIndex.
13501368
13511369
Returns
13521370
-------
1353-
new index (of same type and class...etc) [if inplace, returns None]
1371+
Index
1372+
The same type as the caller or None if inplace is True.
1373+
1374+
See Also
1375+
--------
1376+
Index.set_names : Able to set new names partially and by level.
1377+
1378+
Examples
1379+
--------
1380+
>>> idx = pd.Index(['A', 'C', 'A', 'B'], name='score')
1381+
>>> idx.rename('grade')
1382+
Index(['A', 'C', 'A', 'B'], dtype='object', name='grade')
1383+
1384+
>>> idx = pd.MultiIndex.from_product([['python', 'cobra'],
1385+
... [2018, 2019]],
1386+
... names=['kind', 'year'])
1387+
>>> idx
1388+
MultiIndex(levels=[['cobra', 'python'], [2018, 2019]],
1389+
labels=[[1, 1, 0, 0], [0, 1, 0, 1]],
1390+
names=['kind', 'year'])
1391+
>>> idx.rename(['species', 'year'])
1392+
MultiIndex(levels=[['cobra', 'python'], [2018, 2019]],
1393+
labels=[[1, 1, 0, 0], [0, 1, 0, 1]],
1394+
names=['species', 'year'])
1395+
>>> idx.rename('species')
1396+
Traceback (most recent call last):
1397+
TypeError: Must pass list-like as `names`.
13541398
"""
13551399
return self.set_names([name], inplace=inplace)
13561400

pandas/tests/indexes/multi/test_get_set.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,7 @@ def test_set_levels_labels_names_bad_input(idx):
360360
with tm.assert_raises_regex(ValueError, 'Length of names'):
361361
idx.set_names(names[0], level=[0, 1])
362362

363-
with tm.assert_raises_regex(TypeError, 'string'):
363+
with tm.assert_raises_regex(TypeError, 'Names must be a'):
364364
idx.set_names(names, level=0)
365365

366366

0 commit comments

Comments
 (0)