Skip to content

DOC: Added docs to clarify that MultiIndex.set_levels() interprets passed values as new components of the .levels attribute (#28294) #28797

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 122 commits into from
Closed
Changes from 2 commits
Commits
Show all changes
122 commits
Select commit Hold shift + click to select a range
e8256cc
DOC: added docs for MultiIndex.set_levels (#28294)
hweecat Oct 5, 2019
d9130f2
edit set_levels docstring with additional examples
hweecat Oct 8, 2019
46d88c1
CLN: Exception*2 in groupby wrapper (#28771)
jbrockmendel Oct 8, 2019
1ef3637
TST: un-xfail 1 passing maybe_promote test (#28850)
jbrockmendel Oct 8, 2019
f625730
remove doc note about apply applying a function to the first element …
tlynch1315 Oct 8, 2019
c9b6261
TST: un-xfail 22 tests (#28856)
jbrockmendel Oct 8, 2019
25b1859
TST: Improve compatibility with pypy error messages (#28844)
rlamy Oct 8, 2019
29e56df
TST: Fix not-boxed maybe_promote test (#28852)
jbrockmendel Oct 8, 2019
acde02b
TST: fix 24 xfails in maybe_promote (#28833)
jbrockmendel Oct 8, 2019
5122241
CLN: Assorted cleanups (#28848)
jbrockmendel Oct 8, 2019
df2e081
Clean up Abstract and Naming Definitions for GroupBy (#28847)
WillAyd Oct 8, 2019
43687c0
DOC: Fix missing periods and non capitalized summary beginnings (#28858)
refactoriel Oct 9, 2019
93183ba
fix unnecessary sort in pd.read_json and orient="index" (#28606)
KimDoubleB Oct 9, 2019
71f8ab9
CLN: dont catch Exception in groupby var (#28883)
jbrockmendel Oct 10, 2019
548f83d
CLN: dont catch on groupby.mean (#28878)
jbrockmendel Oct 10, 2019
5cbd82b
CLN: assorted cleanups, remove unicode checks in cython (#28879)
jbrockmendel Oct 10, 2019
fcea0dc
No catching needed for median (#28873)
jbrockmendel Oct 10, 2019
959a760
read_hdf closes HDF5 stores that it didn't open. (#28700)
kboone Oct 10, 2019
4f97ca4
DOC: Fix commpiler typo in contributing.rst (#28891)
shaido987 Oct 10, 2019
9743154
TST: Fix maybe_promote floating non-boxed tests (#28880)
jbrockmendel Oct 10, 2019
9a3e1ef
TST: Fix xfails for non-box maybe_promote on integer dtypes (#28864)
jbrockmendel Oct 10, 2019
eca6079
pandas.io.formats.style.Styler.set_table_attributes: Parameter attrib…
roshni-b Oct 10, 2019
0c4404b
DOC: Fixed PR06 errors in pandas.api.extensions.ExtensionArray (#28885)
roshni-b Oct 10, 2019
de2e086
REF: simplify maybe_promote (#28899)
jbrockmendel Oct 10, 2019
d8f9be7
Fix typo (#28915)
KimDoubleB Oct 11, 2019
230a61a
TYPING: lockdown test modules failing mypy (#28914)
simonjayhawkins Oct 11, 2019
fab2c90
CLN: simplify maybe_promote in float and complex cases (#28913)
jbrockmendel Oct 11, 2019
e1e51df
TYPING: errors reported by mypy 0.730 (#28910)
simonjayhawkins Oct 11, 2019
a4c92ca
clean tests/indexing/common.py (#28904)
topper-123 Oct 11, 2019
3954fa7
REF: use fused types for groupby_helper (#28886)
jbrockmendel Oct 11, 2019
6241b9d
BUG: Allow all int types for merge (GH28870) (#28875)
jjlkant Oct 11, 2019
0474c7f
TST: Fix 36 maybe_promote xfails wanting np.bytes_ instead of np.obje…
jbrockmendel Oct 11, 2019
3fba92e
TYPING: fix type annotation for pandas.io.formats.format._binify (#28…
simonjayhawkins Oct 11, 2019
894eac6
TST: add test coverage for maybe_promote (#23982)
h-vetinari Oct 11, 2019
981299c
TST: Use fixtures instead of setup_method for index tests (#28865)
jschendel Oct 11, 2019
7ea5c96
CLN: Exception (#28853)
jbrockmendel Oct 11, 2019
a31e160
CLN: assorted cleanups, mostly post-black fixups (#28857)
jbrockmendel Oct 11, 2019
0748c91
DOC: PR06 docstring fixes (#28807)
tolaa001 Oct 11, 2019
54b1151
TST: Allow for multiple variables on the same line in docstring valid…
ChiefMilesEdgeworth Oct 11, 2019
d6b058d
CLN: try/except cleanups (#28939)
jbrockmendel Oct 12, 2019
c387a28
BUG: Avoid undefined behaviour when converting from float to timedelt…
siddhesh Oct 12, 2019
fad037e
Added note to 'contributing.rst file', telling users to append GH Iss…
S3rbane Oct 12, 2019
4ade26b
REF: maybe_promote refactor/cleanup (#28897)
jbrockmendel Oct 12, 2019
1e92886
API: Add various deprecated attributes to ._deprecated (#28805)
topper-123 Oct 12, 2019
56b2fd8
TST: Test pivot_table() with categorical data (#28803)
ryankarlos Oct 12, 2019
25059ee
BUG: Need 'windows-1252' encoding for locale names. (#27368)
timcera Oct 12, 2019
f7d162b
DOC: disable nbsphinx including requirejs (#28940)
jorisvandenbossche Oct 12, 2019
625c550
CLN: fix mypy errors in pandas/tests/extension/test_numpy.py #28926 (…
lukasbk Oct 13, 2019
0eee324
TST: add test_series_any_timedelta for GH17667 (#28942)
rohitsanj Oct 13, 2019
2931f02
PR06 doc string fixes (#28946)
tolaa001 Oct 13, 2019
04d7931
fix #28926 pandas\api\test_api.py mypy errors (#28935)
yogendrasoni Oct 13, 2019
06a6b49
Eliminated _WriterBase class, removed unused fixtures from methods in…
dayoreke Oct 13, 2019
851ca1a
Fix mypy errors for pandas\tests\* #28926 (test_algos.py) (#28960)
lrm25 Oct 14, 2019
18a9e4c
DOC: Fixed PR08 and PR09 docstring errors in pandas.Series (#28845)
jb8429 Oct 14, 2019
2f80feb
BUG: Partial fix for docstring validation for parameters (#28765)
ChiefMilesEdgeworth Oct 14, 2019
5b0bf23
DOC: fix formatting in the ExtensionArray docstrings (#28686)
HughKelley Oct 14, 2019
8c5941c
BUG: use EA.astype in ExtensionBlock.to_native_types (#28841)
jorisvandenbossche Oct 14, 2019
97c6567
Document 3.8 compatibility (#28982)
TomAugspurger Oct 15, 2019
80412cc
CI: 3.8 build (#28730)
jbrockmendel Oct 15, 2019
c65cfb6
remove unnecessary get_value_at calls (#28977)
jbrockmendel Oct 15, 2019
3eca505
add types tot rank_1d_, rank_2d (#28978)
jbrockmendel Oct 15, 2019
3b34368
CLN: Exception in _libs (#28967)
jbrockmendel Oct 15, 2019
125739f
CLN: pandas-dev#28926 Fix pandas/tests/tseries/offsets/test_offsets_p…
aaditya-panik Oct 15, 2019
6dc53bb
CLN: pandas-dev#28926 Fix mypy errors in pandas/tests/io/parser/conft…
aaditya-panik Oct 15, 2019
19c8fad
DOC: 0.25.2 whatsnew cleanup (#29000)
TomAugspurger Oct 15, 2019
8d3fec9
DOC: fix is_scalar documentation (#28998) (#29004)
andreasbuhr Oct 15, 2019
74bbbb0
Setuptools CI fixup (#29010)
TomAugspurger Oct 15, 2019
de67bb7
CLN: Fix mypy errors in pandas/tests/io/test_sql.py Reverted and adde…
aaditya-panik Oct 16, 2019
d52850f
DOC: Reference level name as Term of HDFStore.select query (#28791) (…
nrebena Oct 16, 2019
0a108f0
CLN: move small bits outside of try/excepts (#28962)
jbrockmendel Oct 16, 2019
c903e5e
CLN: Consistent and Annotated Return Type of _iterate_slices (#28958)
WillAyd Oct 16, 2019
b632ca0
restore xfail (#29013)
jbrockmendel Oct 16, 2019
79a5f7c
To html encoding add (#28692)
Oct 16, 2019
a0d01b8
add uint64 support for some libgroupby funcs (#28931)
jbrockmendel Oct 16, 2019
86e187f
BUG: CategoricalIndex allowed reindexing duplicate sources (#28257)
batterseapower Oct 16, 2019
46e89b0
Separate MultiIndex names from levels (#27242)
topper-123 Oct 16, 2019
5ad908e
DOC: fix code-block in the reshaping docs (#28838)
oktaysabak Oct 16, 2019
fdc322a
CLN: Fix mypy error in pandas/tests/computation/test_eval.py (#29007)
immaxchen Oct 16, 2019
b63f829
CLN: Clean DirNameMixin (#28957)
topper-123 Oct 16, 2019
bff90a3
REF: de-duplicate groupby_helper code (#28934)
jbrockmendel Oct 16, 2019
30a0e2e
CLN: fix mypy error pandas/tests/plotting/test_backend.py (#29016)
saska Oct 16, 2019
143eb38
REF: re-raise AssertionError unchanged (#28959)
jbrockmendel Oct 16, 2019
9486f04
tests/indexing/test_coercion.py typefix (#28990)
lukasbk Oct 16, 2019
da3d0d9
DEPR: remove previously-deprecated broadcast/reduce kwargs from DataF…
jbrockmendel Oct 16, 2019
9d45934
BUG: Fix TypeError in _cython_agg_blocks (#29035)
jbrockmendel Oct 17, 2019
509eb14
CI: xfail on numpy 1.18 (#29057)
jbrockmendel Oct 17, 2019
6d35836
Stop catching TypeError in groupby methods (#29060)
jbrockmendel Oct 17, 2019
b0f33b3
API: Restore getting name from MultiIndex level (#29061)
TomAugspurger Oct 18, 2019
709436d
fixed issue of mypy for test_ujson (#29022)
iamrajhans Oct 18, 2019
f556a71
CLN: derivation of nogil param (#29047)
jbrockmendel Oct 18, 2019
827440a
REF: remove groupby_helper (#29040)
jbrockmendel Oct 18, 2019
1e4fe0a
ENH: Informative dtype message for for assert_series_equal (#28993)
moi90 Oct 18, 2019
2683954
TST: add regression test for all-none-groupby (#29067)
crepererum Oct 18, 2019
45dc6d3
Fix mypy errors for pandas\tests\*: test_convert_to.py (#28965)
lrm25 Oct 18, 2019
58d34d9
CLN: catch less in groupby (#29077)
jbrockmendel Oct 18, 2019
e54b995
CLN: simplify take_2d_multi (#29065)
jbrockmendel Oct 18, 2019
2701f52
REF: use fused types in algos_rank_helper (#29044)
jbrockmendel Oct 18, 2019
09a9f5f
DOC: updated categorical docstring (#29068)
javad94 Oct 18, 2019
b372ac4
CLN: tighten exception catching in indexes (#29078)
jbrockmendel Oct 19, 2019
09fc1b4
explain set_levels().levels examples + formatting
hweecat Oct 19, 2019
5bdd7db
explain set_levels().levels examples + formatting
hweecat Oct 19, 2019
9c4a371
[#22550] Remove TestData from series-tests test_quantile.py (#29096)
SaturnFromTitan Oct 19, 2019
d186f77
Merge branches 'docfix-multiindex-setlevels' and 'docfix-multiindex-s…
hweecat Oct 19, 2019
a2f5ae2
comments, catch less (#29088)
jbrockmendel Oct 19, 2019
cb99e24
REF: remove algos_rank_helper (#29086)
jbrockmendel Oct 19, 2019
930dd84
CLN: Exception in DataFrame._reduce (#29085)
jbrockmendel Oct 19, 2019
7c8c8c8
[#22550] Remove TestData from series-tests test_operators.py (#29084)
SaturnFromTitan Oct 19, 2019
e4afa45
TST: 2d index when constructing dataframe (#25416). (#29083)
jhereth Oct 19, 2019
cb76dcb
TST: regression test for groupby with datetime and timedelta (#15562)…
jhereth Oct 19, 2019
6931051
CLN: cython and docstring cleanups (#29089)
jbrockmendel Oct 19, 2019
04893a9
BUG: parse_time_string failing to raise TypeError (#29098)
jbrockmendel Oct 19, 2019
971d191
explain set_levels().levels examples + formatting
hweecat Oct 19, 2019
8ccc7c7
formatting changes
hweecat Oct 20, 2019
36803b9
formatting changes
hweecat Oct 20, 2019
e623f0f
Add a regression test for the timezone issue (#29097)
grigoriosgiann Oct 20, 2019
d2d8785
Fix typing errors (#29115)
AbhijeetKrishnan Oct 20, 2019
9f03837
Fix typing errors (#29114)
AbhijeetKrishnan Oct 20, 2019
9026a79
DOC: added docs for MultiIndex.set_levels (#28294)
hweecat Oct 5, 2019
4f5e38d
edit set_levels docstring with additional examples
hweecat Oct 8, 2019
c00cc9d
explain set_levels().levels examples + formatting
hweecat Oct 19, 2019
211574b
explain set_levels().levels examples + formatting
hweecat Oct 19, 2019
93c84bb
Merge branch 'docfix-multiindex-setlevels' of https://github.com/hwee…
hweecat Oct 21, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 36 additions & 9 deletions pandas/core/indexes/multi.py
Original file line number Diff line number Diff line change
Expand Up @@ -719,8 +719,16 @@ def _set_levels(

def set_levels(self, levels, level=None, inplace=False, verify_integrity=True):
"""
Set new levels on MultiIndex. Defaults to returning
new index.
Set levels on MultiIndex by passing a new value for each
index in the level. Defaults to returning new
index.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The short description (this first paragraph) needs to be a single liner (in other paragraphs we can have as much information as needed).

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oops, just realised I kinda broke PEP 257 for docstrings. Will make the changes.


It is assumed that a new value is provided for each code describing
values in the level. If the number of values passed is more than
the number of index values in the level, ``set_levels`` will still
pass the values to the level. The passed values are stored in the
MultiIndex FrozenList even though the index values may be truncated
in the MultiIndex output from set_levels.

Parameters
----------
Expand All @@ -740,32 +748,51 @@ def set_levels(self, levels, level=None, inplace=False, verify_integrity=True):
Examples
--------
>>> idx = pd.MultiIndex.from_tuples([(1, 'one'), (1, 'two'),
(2, 'one'), (2, 'two')],
(2, 'one'), (2, 'two'),
(3, 'one'), (3, 'two')],
names=['foo', 'bar'])
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you should >>> idx after creating, so it can be compared with the result of applying set_levels.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, will apply this change.

>>> idx.set_levels([['a', 'b'], [1, 2]])
>>> idx.set_levels([['a', 'b', 'c'], [1, 2]])
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do you think an extra value makes this example clearer? I think a more concise example is easier to read.

Copy link
Contributor Author

@hweecat hweecat Oct 19, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My intention of adding an extra value at one of the levels (same for the MultiIndex above) is to further highlight the differences in passing values to the two levels in the MultiIndex, for which the number of values in each level are not equal. Using different number of values in each level is to emphasize that set_levels() passes values to indexes on 'by level' basis (by changing the levels attribute), not on 'by row / integer code' basis.

Then again, if a more concise example could also explain sufficiently how set_levels() work without ambiguity, I'm okay with reverting to the original MultiIndex. Do let me know what you think, so that I can make the necessary modifications to subsequent examples. 👍

MultiIndex([('a', 1),
('a', 2),
('b', 1),
('b', 2)],
('b', 2),
('c', 1),
('c', 2)],
names=['foo', 'bar'])
>>> idx.set_levels(['a', 'b'], level=0)
>>> idx.set_levels(['a', 'b', 'c'], level=0)
MultiIndex([('a', 'one'),
('a', 'two'),
('b', 'one'),
('b', 'two')],
('b', 'two'),
('c', 'one'),
('c', 'two')],
names=['foo', 'bar'])
>>> idx.set_levels(['a', 'b'], level='bar')
MultiIndex([(1, 'a'),
(1, 'b'),
(2, 'a'),
(2, 'b')],
(2, 'b'),
(3, 'a'),
(3, 'b')],
names=['foo', 'bar'])
>>> idx.set_levels([['a', 'b', 'c'], [1, 2]], level=[0, 1])
MultiIndex([('a', 1),
('a', 2),
('b', 1),
('b', 2),
('c', 1),
('c', 2)],
names=['foo', 'bar'])
>>> idx.set_levels([['a', 'b'], [1, 2]], level=[0, 1])
>>> idx.set_levels([['a', 'b', 'c'], [1, 2]], level=[0, 1]).levels
FrozenList([['a', 'b', 'c'], [1, 2]])
>>> idx.set_levels([['a', 'b', 'c'], [1, 2, 3, 4]], level=[0, 1])
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you separate this example from the previous, and explain what are we showing?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The intention of this example is to illustrate that set_levels() passes values into the levels attribute that is represented by a FrozenList containing list of values for each level in the MultiIndex, even when the number of values passed for a level is more than the number of indexes available in the MultiIndex itself.

I'll separate this example from the previous example, and append the explanation to the example.

MultiIndex([('a', 1),
('a', 2),
('b', 1),
('b', 2)],
names=['foo', 'bar'])
>>> idx.set_levels([['a', 'b', 'c'], [1, 2, 3, 4]], level=[0, 1]).levels
FrozenList([['a', 'b', 'c'], [1, 2, 3, 4]])
"""
if is_list_like(levels) and not isinstance(levels, Index):
levels = list(levels)
Expand Down