-
-
Notifications
You must be signed in to change notification settings - Fork 18.5k
ENH: make Styler
compatible with non-unique indexes
#41269
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
Merged
Merged
Changes from all commits
Commits
Show all changes
22 commits
Select commit
Hold shift + click to select a range
1cc569f
ENH: make `Styler.format` compatible with non-unique indexes (with Te…
attack68 6982554
ENH: error when using a non-unique subset with .apply and .applymap (…
attack68 a3694db
ENH: error when using a non-unique subset with .apply and .applymap: …
attack68 5c6669c
ENH: make table_styles work with non-unique + TST: refactor to own file
attack68 732c7d5
ENH: error catching
attack68 4c99130
ENH: error catching
attack68 57e8bef
Merge remote-tracking branch 'upstream/master' into styler_non_unique
attack68 a7a2966
ENH: deal with tooltips and raise (inc Tests)
attack68 19fb7f9
ENH: deal with tooltips and raise (inc Tests)
attack68 4ce559e
ENH: deal with tset_td_classes and raise (inc Tests)
attack68 7f28111
ENH: tests for hide_columns
attack68 5043c01
ENH: remove style ValueError
attack68 9fc6cd3
Merge remote-tracking branch 'upstream/master' into styler_non_unique
attack68 09764ba
whats new
attack68 9451aae
Merge remote-tracking branch 'upstream/master' into styler_non_unique
attack68 4faeb29
prohibit apply and applymap in non-unique case
attack68 aed0536
Merge remote-tracking branch 'upstream/master' into styler_non_unique
attack68 3a8f11e
move outside loop
attack68 51233be
create conditional for performance
attack68 8454c5e
create conditional for performance
attack68 c3b7af8
take indexing out of loops
attack68 20cd19f
take indexing out of loops
attack68 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,124 @@ | ||
import pytest | ||
|
||
from pandas import ( | ||
DataFrame, | ||
IndexSlice, | ||
) | ||
|
||
pytest.importorskip("jinja2") | ||
|
||
from pandas.io.formats.style import Styler | ||
|
||
|
||
@pytest.fixture | ||
def df(): | ||
return DataFrame( | ||
[[1, 2, 3], [4, 5, 6], [7, 8, 9]], | ||
index=["i", "j", "j"], | ||
columns=["c", "d", "d"], | ||
dtype=float, | ||
) | ||
|
||
|
||
@pytest.fixture | ||
def styler(df): | ||
return Styler(df, uuid_len=0) | ||
|
||
|
||
def test_format_non_unique(df): | ||
# GH 41269 | ||
|
||
# test dict | ||
html = df.style.format({"d": "{:.1f}"}).render() | ||
for val in ["1.000000<", "4.000000<", "7.000000<"]: | ||
assert val in html | ||
for val in ["2.0<", "3.0<", "5.0<", "6.0<", "8.0<", "9.0<"]: | ||
assert val in html | ||
|
||
# test subset | ||
html = df.style.format(precision=1, subset=IndexSlice["j", "d"]).render() | ||
for val in ["1.000000<", "4.000000<", "7.000000<", "2.000000<", "3.000000<"]: | ||
assert val in html | ||
for val in ["5.0<", "6.0<", "8.0<", "9.0<"]: | ||
assert val in html | ||
|
||
|
||
@pytest.mark.parametrize("func", ["apply", "applymap"]) | ||
def test_apply_applymap_non_unique_raises(df, func): | ||
# GH 41269 | ||
if func == "apply": | ||
op = lambda s: ["color: red;"] * len(s) | ||
else: | ||
op = lambda v: "color: red;" | ||
|
||
with pytest.raises(KeyError, match="`Styler.apply` and `.applymap` are not"): | ||
getattr(df.style, func)(op)._compute() | ||
|
||
|
||
def test_table_styles_dict_non_unique_index(styler): | ||
styles = styler.set_table_styles( | ||
{"j": [{"selector": "td", "props": "a: v;"}]}, axis=1 | ||
).table_styles | ||
assert styles == [ | ||
{"selector": "td.row1", "props": [("a", "v")]}, | ||
{"selector": "td.row2", "props": [("a", "v")]}, | ||
] | ||
|
||
|
||
def test_table_styles_dict_non_unique_columns(styler): | ||
styles = styler.set_table_styles( | ||
{"d": [{"selector": "td", "props": "a: v;"}]}, axis=0 | ||
).table_styles | ||
assert styles == [ | ||
{"selector": "td.col1", "props": [("a", "v")]}, | ||
{"selector": "td.col2", "props": [("a", "v")]}, | ||
] | ||
|
||
|
||
def test_tooltips_non_unique_raises(styler): | ||
# ttips has unique keys | ||
ttips = DataFrame([["1", "2"], ["3", "4"]], columns=["c", "d"], index=["a", "b"]) | ||
styler.set_tooltips(ttips=ttips) # OK | ||
|
||
# ttips has non-unique columns | ||
ttips = DataFrame([["1", "2"], ["3", "4"]], columns=["c", "c"], index=["a", "b"]) | ||
with pytest.raises(KeyError, match="Tooltips render only if `ttips` has unique"): | ||
styler.set_tooltips(ttips=ttips) | ||
|
||
# ttips has non-unique index | ||
ttips = DataFrame([["1", "2"], ["3", "4"]], columns=["c", "d"], index=["a", "a"]) | ||
with pytest.raises(KeyError, match="Tooltips render only if `ttips` has unique"): | ||
styler.set_tooltips(ttips=ttips) | ||
|
||
|
||
def test_set_td_classes_non_unique_raises(styler): | ||
# classes has unique keys | ||
classes = DataFrame([["1", "2"], ["3", "4"]], columns=["c", "d"], index=["a", "b"]) | ||
styler.set_td_classes(classes=classes) # OK | ||
|
||
# classes has non-unique columns | ||
classes = DataFrame([["1", "2"], ["3", "4"]], columns=["c", "c"], index=["a", "b"]) | ||
with pytest.raises(KeyError, match="Classes render only if `classes` has unique"): | ||
styler.set_td_classes(classes=classes) | ||
|
||
# classes has non-unique index | ||
classes = DataFrame([["1", "2"], ["3", "4"]], columns=["c", "d"], index=["a", "a"]) | ||
with pytest.raises(KeyError, match="Classes render only if `classes` has unique"): | ||
styler.set_td_classes(classes=classes) | ||
|
||
|
||
def test_hide_columns_non_unique(styler): | ||
ctx = styler.hide_columns(["d"])._translate() | ||
|
||
assert ctx["head"][0][1]["display_value"] == "c" | ||
assert ctx["head"][0][1]["is_visible"] is True | ||
|
||
assert ctx["head"][0][2]["display_value"] == "d" | ||
assert ctx["head"][0][2]["is_visible"] is False | ||
|
||
assert ctx["head"][0][3]["display_value"] == "d" | ||
assert ctx["head"][0][3]["is_visible"] is False | ||
|
||
assert ctx["body"][0][1]["is_visible"] is True | ||
assert ctx["body"][0][2]["is_visible"] is False | ||
assert ctx["body"][0][3]["is_visible"] is False |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.