-
-
Notifications
You must be signed in to change notification settings - Fork 18.5k
BUG: to_html misses truncation indicators (...) when index=False #22786
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
Changes from 9 commits
72b8011
a7b2424
8a82df5
f028b7d
4c1bca8
2cd532e
d8fe9b5
ecad6c8
46d171f
c6cb507
de99a65
15bd352
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -305,6 +305,8 @@ def _column_header(): | |
align = self.fmt.justify | ||
|
||
if truncate_h: | ||
if self.fmt.index is False: | ||
row_levels = 0 | ||
ins_col = row_levels + self.fmt.tr_col_num | ||
col_row.insert(ins_col, '...') | ||
|
||
|
@@ -342,8 +344,21 @@ def _write_body(self, indent): | |
else: | ||
self._write_regular_rows(fmt_values, indent) | ||
else: | ||
for i in range(min(len(self.frame), self.max_rows)): | ||
row = [fmt_values[j][i] for j in range(len(self.columns))] | ||
truncate_h = self.fmt.truncate_h | ||
truncate_v = self.fmt.truncate_v | ||
ncols = len(self.fmt.tr_frame.columns) | ||
nrows = len(self.fmt.tr_frame) | ||
|
||
row = [] | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. can you give some comments on what is happening here, would not object to a self.write_row? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @jreback But for the Currently the truncation tests in To avoid potential regression on the notebook display codepath ( Tests could be added but I wanted to avoid going out of scope on this PR. The existing code for the So I would agree that a How should I proceed? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
can you do a pre-cursor PR which locks down the tests first? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @simonjayhawkins i mean comments in the code |
||
for i in range(nrows): | ||
if truncate_v and i == (self.fmt.tr_row_num): | ||
str_sep_row = ['...'] * len(row) | ||
self.write_tr(str_sep_row, indent, | ||
self.indent_delta, tags=None) | ||
row = [fmt_values[j][i] for j in range(ncols)] | ||
if truncate_h: | ||
dot_col_ix = self.fmt.tr_col_num | ||
row.insert(dot_col_ix, '...') | ||
self.write_tr(row, indent, self.indent_delta, tags=None) | ||
|
||
indent -= self.indent_delta | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
<table border="1" class="dataframe"> | ||
<thead> | ||
<tr style="text-align: right;"> | ||
<th>0</th> | ||
<th>1</th> | ||
</tr> | ||
</thead> | ||
<tbody> | ||
<tr> | ||
<td>1.764052</td> | ||
<td>0.400157</td> | ||
</tr> | ||
<tr> | ||
<td>0.978738</td> | ||
<td>2.240893</td> | ||
</tr> | ||
<tr> | ||
<td>...</td> | ||
<td>...</td> | ||
</tr> | ||
<tr> | ||
<td>0.950088</td> | ||
<td>-0.151357</td> | ||
</tr> | ||
<tr> | ||
<td>-0.103219</td> | ||
<td>0.410599</td> | ||
</tr> | ||
</tbody> | ||
</table> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
<table border="1" class="dataframe"> | ||
<thead> | ||
<tr style="text-align: right;"> | ||
<th>0</th> | ||
<th>1</th> | ||
<th>...</th> | ||
<th>3</th> | ||
<th>4</th> | ||
</tr> | ||
</thead> | ||
<tbody> | ||
<tr> | ||
<td>1.764052</td> | ||
<td>0.400157</td> | ||
<td>...</td> | ||
<td>2.240893</td> | ||
<td>1.867558</td> | ||
</tr> | ||
<tr> | ||
<td>-0.977278</td> | ||
<td>0.950088</td> | ||
<td>...</td> | ||
<td>-0.103219</td> | ||
<td>0.410599</td> | ||
</tr> | ||
</tbody> | ||
</table> |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -22,6 +22,28 @@ | |
pass | ||
|
||
|
||
def expected_html(datapath, name): | ||
""" | ||
Read HTML file from formats data directory. | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. might be nice to change some of the existing tests to use this function (future PR though) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. PR #23747 to change existing tests to use this function. |
||
Parameters | ||
---------- | ||
datapath : pytest fixture | ||
The datapath fixture injected into a test by pytest. | ||
name : str | ||
The name of the HTML file without the suffix. | ||
|
||
Returns | ||
------- | ||
str : contents of HTML file. | ||
""" | ||
filename = '.'.join([name, 'html']) | ||
TomAugspurger marked this conversation as resolved.
Show resolved
Hide resolved
|
||
filepath = datapath('io', 'formats', 'data', filename) | ||
with open(filepath) as f: | ||
html = f.read() | ||
return html.rstrip() | ||
|
||
|
||
class TestToHTML(object): | ||
|
||
def test_to_html_with_col_space(self): | ||
|
@@ -1881,6 +1903,22 @@ def test_to_html_multiindex_max_cols(self): | |
</table>""") | ||
assert result == expected | ||
|
||
def test_to_html_truncation_index_false_max_rows(self, datapath): | ||
# GH 15019 | ||
np.random.seed(seed=0) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. do really need to set the seed? |
||
df = pd.DataFrame(np.random.randn(5, 2)) | ||
result = df.to_html(max_rows=4, index=False) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. can you parameterize over |
||
expected = expected_html(datapath, 'gh15019_expected_output') | ||
assert result == expected | ||
|
||
def test_to_html_truncation_index_false_max_cols(self, datapath): | ||
# GH 22783 | ||
np.random.seed(seed=0) | ||
df = pd.DataFrame(np.random.randn(2, 5)) | ||
result = df.to_html(max_cols=4, index=False) | ||
expected = expected_html(datapath, 'gh22783_expected_output') | ||
assert result == expected | ||
|
||
def test_to_html_notebook_has_style(self): | ||
df = pd.DataFrame({"A": [1, 2, 3]}) | ||
result = df.to_html(notebook=True) | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Instead of doing
is False
can you leverage the implicit truthiness here and doif not self.fmt.index
? While not documented I believeindex=0
andindex=None
are acceptable in this and other parsers, so would be ideal to handle those consistently with FalseThere was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
can you update this