From b8a36c32120e016ad50e3c1bbdc14a0daf5f71e6 Mon Sep 17 00:00:00 2001 From: Xinrong Meng Date: Sat, 21 Nov 2020 17:27:43 -0800 Subject: [PATCH 1/4] MultiIndex examples in docstrings --- pandas/core/indexes/multi.py | 85 ++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/pandas/core/indexes/multi.py b/pandas/core/indexes/multi.py index 9eb34d920a328..6c77d05df2796 100644 --- a/pandas/core/indexes/multi.py +++ b/pandas/core/indexes/multi.py @@ -893,6 +893,15 @@ def set_levels(self, levels, level=None, inplace=None, verify_integrity=True): def nlevels(self) -> int: """ Integer number of levels in this MultiIndex. + + Examples + -------- + >>> mi = pd.MultiIndex.from_arrays([['a'], ['b'], ['c']]) + >>> mi + MultiIndex([('a', 'b', 'c')], + ) + >>> mi.nlevels + 3 """ return len(self._levels) @@ -900,6 +909,15 @@ def nlevels(self) -> int: def levshape(self): """ A tuple with the length of each level. + + Examples + -------- + >>> mi = pd.MultiIndex.from_arrays([['a'], ['b'], ['c']]) + >>> mi + MultiIndex([('a', 'b', 'c')], + ) + >>> mi.levshape + (1, 1, 1) """ return tuple(len(x) for x in self.levels) @@ -1701,6 +1719,32 @@ def to_frame(self, index=True, name=None): -------- DataFrame : Two-dimensional, size-mutable, potentially heterogeneous tabular data. + + Examples + -------- + >>> mi = pd.MultiIndex.from_arrays([['a', 'b'], ['c', 'd']]) + >>> mi + MultiIndex([('a', 'c'), + ('b', 'd')], + ) + + >>> df = mi.to_frame() + >>> df + 0 1 + a c a c + b d b d + + >>> df = mi.to_frame(index=False) + >>> df + 0 1 + 0 a c + 1 b d + + >>> df = mi.to_frame(name=['x', 'y']) + >>> df + x y + a c a c + b d b d """ from pandas import DataFrame @@ -2238,6 +2282,24 @@ def reorder_levels(self, order): Returns ------- MultiIndex + + Examples + -------- + >>> mi = pd.MultiIndex.from_arrays([[1, 2], [3, 4]], names=['x', 'y']) + >>> mi + MultiIndex([(1, 3), + (2, 4)], + names=['x', 'y']) + + >>> mi.reorder_levels(order=[1, 0]) + MultiIndex([(3, 1), + (4, 2)], + names=['y', 'x']) + + >>> mi.reorder_levels(order=['y', 'x']) + MultiIndex([(3, 1), + (4, 2)], + names=['y', 'x']) """ order = [self._get_level_number(i) for i in order] if len(order) != self.nlevels: @@ -2296,6 +2358,29 @@ def sortlevel(self, level=0, ascending=True, sort_remaining=True): Resulting index. indexer : np.ndarray Indices of output values in original index. + + Examples + -------- + >>> mi = pd.MultiIndex.from_arrays([[2, 1], [0, 4]]) + >>> mi + MultiIndex([(2, 0), + (1, 4)], + ) + + >>> mi.sortlevel() + (MultiIndex([(1, 4), + (2, 0)], + ), array([1, 0])) + + >>> mi.sortlevel(1) + (MultiIndex([(2, 0), + (1, 4)], + ), array([0, 1])) + + >>> mi.sortlevel(level=1, ascending=False) + (MultiIndex([(1, 4), + (2, 0)], + ), array([1, 0])) """ if isinstance(level, (str, int)): level = [level] From a9a6daf2abaf0d843a51dc2df482e9e900b726a8 Mon Sep 17 00:00:00 2001 From: Xinrong Meng Date: Sun, 22 Nov 2020 09:40:35 -0800 Subject: [PATCH 2/4] MultiIndex names and droplevel --- pandas/core/indexes/base.py | 26 ++++++++++++++++++++++++++ pandas/core/indexes/multi.py | 16 +++++++++++++++- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index 5eb890c9817c0..360843c3799c8 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -1575,6 +1575,32 @@ def droplevel(self, level=0): Returns ------- Index or MultiIndex + + Examples + -------- + >>> mi = pd.MultiIndex.from_arrays([[1, 2], [3, 4], [5, 6]], names=['x', 'y', 'z']) + >>> mi + MultiIndex([(1, 3, 5), + (2, 4, 6)], + names=['x', 'y', 'z']) + + >>> mi.droplevel() + MultiIndex([(3, 5), + (4, 6)], + names=['y', 'z']) + + >>> mi.droplevel(2) + MultiIndex([(1, 3), + (2, 4)], + names=['x', 'y']) + + >>> mi.droplevel('z') + MultiIndex([(1, 3), + (2, 4)], + names=['x', 'y']) + + >>> mi.droplevel(['x', 'y']) + Int64Index([5, 6], dtype='int64', name='z') """ if not isinstance(level, (tuple, list)): level = [level] diff --git a/pandas/core/indexes/multi.py b/pandas/core/indexes/multi.py index 6c77d05df2796..365154adee43f 100644 --- a/pandas/core/indexes/multi.py +++ b/pandas/core/indexes/multi.py @@ -1475,7 +1475,21 @@ def _set_names(self, names, level=None, validate=True): self._reset_cache() names = property( - fset=_set_names, fget=_get_names, doc="""\nNames of levels in MultiIndex.\n""" + fset=_set_names, + fget=_get_names, + doc=""" + Names of levels in MultiIndex. + + Examples + -------- + >>> mi = pd.MultiIndex.from_arrays([[1, 2], [3, 4], [5, 6]], names=['x', 'y', 'z']) + >>> mi + MultiIndex([(1, 3, 5), + (2, 4, 6)], + names=['x', 'y', 'z']) + >>> mi.names + FrozenList(['x', 'y', 'z']) + """, ) # -------------------------------------------------------------------- From 05d92f5a2f2ae4a1b5b0c99d4772c51d31efcbba Mon Sep 17 00:00:00 2001 From: Xinrong Meng Date: Sun, 22 Nov 2020 09:44:34 -0800 Subject: [PATCH 3/4] Shorten lines --- pandas/core/indexes/base.py | 3 ++- pandas/core/indexes/multi.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index 360843c3799c8..da57fd8f0da78 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -1578,7 +1578,8 @@ def droplevel(self, level=0): Examples -------- - >>> mi = pd.MultiIndex.from_arrays([[1, 2], [3, 4], [5, 6]], names=['x', 'y', 'z']) + >>> mi = pd.MultiIndex.from_arrays( + ... [[1, 2], [3, 4], [5, 6]], names=['x', 'y', 'z']) >>> mi MultiIndex([(1, 3, 5), (2, 4, 6)], diff --git a/pandas/core/indexes/multi.py b/pandas/core/indexes/multi.py index 365154adee43f..7c80d1d7f65bc 100644 --- a/pandas/core/indexes/multi.py +++ b/pandas/core/indexes/multi.py @@ -1482,7 +1482,8 @@ def _set_names(self, names, level=None, validate=True): Examples -------- - >>> mi = pd.MultiIndex.from_arrays([[1, 2], [3, 4], [5, 6]], names=['x', 'y', 'z']) + >>> mi = pd.MultiIndex.from_arrays( + ... [[1, 2], [3, 4], [5, 6]], names=['x', 'y', 'z']) >>> mi MultiIndex([(1, 3, 5), (2, 4, 6)], From 975eb9299455e0487c204597219dc1dd665bdfc8 Mon Sep 17 00:00:00 2001 From: Xinrong Meng Date: Sun, 22 Nov 2020 14:07:28 -0800 Subject: [PATCH 4/4] Example for sort_remaining in sortlevel --- pandas/core/indexes/multi.py | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/pandas/core/indexes/multi.py b/pandas/core/indexes/multi.py index 7c80d1d7f65bc..d5f82a9791cf3 100644 --- a/pandas/core/indexes/multi.py +++ b/pandas/core/indexes/multi.py @@ -2376,26 +2376,31 @@ def sortlevel(self, level=0, ascending=True, sort_remaining=True): Examples -------- - >>> mi = pd.MultiIndex.from_arrays([[2, 1], [0, 4]]) + >>> mi = pd.MultiIndex.from_arrays([[0, 0], [2, 1]]) >>> mi - MultiIndex([(2, 0), - (1, 4)], + MultiIndex([(0, 2), + (0, 1)], ) >>> mi.sortlevel() - (MultiIndex([(1, 4), - (2, 0)], + (MultiIndex([(0, 1), + (0, 2)], ), array([1, 0])) - >>> mi.sortlevel(1) - (MultiIndex([(2, 0), - (1, 4)], + >>> mi.sortlevel(sort_remaining=False) + (MultiIndex([(0, 2), + (0, 1)], ), array([0, 1])) - >>> mi.sortlevel(level=1, ascending=False) - (MultiIndex([(1, 4), - (2, 0)], + >>> mi.sortlevel(1) + (MultiIndex([(0, 1), + (0, 2)], ), array([1, 0])) + + >>> mi.sortlevel(1, ascending=False) + (MultiIndex([(0, 2), + (0, 1)], + ), array([0, 1])) """ if isinstance(level, (str, int)): level = [level]