Added
- We have added the Scroller extension of DataTables to the
dt_for_itablespackage. Usescroller=Truetogether withscrollYto enable virtual scrolling for large tables. ThedeferRenderoption is also now supported and pairs naturally with Scroller for improved rendering performance #380. - We have added the ColReorder extension of DataTables to the
dt_for_itablespackage. UsecolReorder=Trueto let users drag and drop column headers to reorder them. - Our ITables widget works in Panel. We have added an example Panel app to demonstrate this.
Added
- Categorical columns (
pd.CategoricalDtype,pl.Categorical,pl.Enum) are now sorted according to the category order rather than alphabetically. Null/missing values sort first. Setadd_rank_to_categories=Falseto revert to alphabetical sorting (#501). - A new Pixi environment lets you build the package locally:
pixi run -e build hatch build - Another Pixi environment lets you test the example streamlit app:
pixi run -e streamlit-app streamlit run apps/streamlit/itables_app.py
Changed
- The Streamlit component has been migrated to
st.components.v2, which renders inline (no iframe) and uses a cleaner function-based lifecycle (#521, #519) - We have updated TypeScript to its latest version (#543)
- We have updated the JavaScript dependencies of
dt_for_itables(#545),itables_anywidget(#544), anditables_for_dash(#546) - We have updated
@babel/plugin-transform-modules-systemjs(#547) - We have updated GitHub Actions dependencies in the workflows (#548)
- We now allow the build step to comment on pull requests (#552), and build the wheel and conda packages in parallel (#656)
Fixed
- We have fixed the missing leading whitespace in lengthMenu label (#542)
- We have added a new CSS rule to make sure that sorting icons are always displayed on the same side ([#535])
- We have updated
postcssinitables_for_dashto address a security issue (#549) - We have fixed a
TypeErrorraised bydash-generate-componentswhen buildingitables_for_dashwithnpm run build
Fixed
- We have fixed a DataTables "Requested unknown parameter" warning triggered when updating an
ITablewidget to a dataframe with a different column structure (e.g., a dataframe with float columns followed by an empty dataframe) (#527). Thanks to newrokor for reporting this!
Fixed
- We have fixed a
ValueErrorraised byto_html_datatableon columns with numpy floating scalars (float32,float16) containingNaNorInfvalues (#524). Thanks to Luke Tsekouras for reporting this!
Added
- We have added the FixedHeader extension of DataTables to the
dt_for_itablespackage (#496). Thanks to Luke Tsekouras for suggesting this!
Changed
- The HTML code generated by ITables is now deterministic. Thanks to Tim Maier for suggesting and implementing this! (#504)
- We have introduced more line breaks in the HTML to make it easier to read (#502)
Fixed
- We have fixed the ordering of floats (#508)
- We no longer calculate the rank of floats; they are now sorted directly by their value (#490)
- We have added an optional
columnControltooption.py. Thanks to kultura-luke for pointing out at this (#496) - We have fixed one test on the streamlit example app (#509)
- We have fixed the build step as well (#513)
- We have updated the dependencies of the ITables extension for Dash to address three vulnerability issues (#520)
Changed
- Floats are formatted using the underlying dataframe formatter when
format_floats_in_pythonis"auto"(the default). Set that optionFalseif you want to format the values in JS directly (#483). - Complex Polars objects are formatted using Polars' internal method
x._s.get_fmt(#471) - We have updated
dt_for_itablesto the latest version ofdatatables.net-dt==2.3.7(#485) - The default look of ITables is more compact. Create an
itables.tomlconfiguration file with justclasses = ["display", "nowrap"]to revert the change locally.
Fixed
- We have fixed an issue with
show_dtypesfor certain dataframes (#480) - We have updated the JavaScript dependencies of the Streamlit extension (#477, #479)
Fixed
- The
typing_extensionspackage is required for static type checking on Python <= 3.10 (#473)
Fixed
- We have fixed a conda build error:
TypeError: typing.Any is not subscriptable(#468, #469), and added more tests
Added
- ITables has no dependencies (#457,#465). Also, it has been tested with Python 3.14.
- When Narwhals is installed, ITables can show cuDF and Modin DataFrames, as well as PyArrow tables. Many thanks to Marco Gorelli and to Dea María Léon for making this happen! (#325)
- We have added a new
show_dtypesoption. It defaults to"auto", meaning that dtypes are only shown for Polars Dataframes by default (#449) - Another new option is
show_df_type(defaults toFalse) to show the DataFrame or Series type (#448) - When displaying Polars DataFrames, ITables will format floats using
float_precision, if set on thepl.Configobject (#447) - The development environment for ITables is now controlled with Pixi (#453)
- A conda package is built (and attached) to each PR (#438)
Fixed
- We need to use
hatch<1.16.0to build ITables (jupyter-builder-#40) - ITables now works with
datadog(#451)
Changed
- We have updated the JavaScript dependencies of our Streamlit component
Fixed
platformdirsis an optional dependency of ITables (#437)
Changed
tomliis an optional dependency of ITables (#436)
Fixed
- The offline mode now allows the init cell to be rendered after the table cells. It should work more reliably in VS Code (#424)
Added
- We have added the
columnControlextension that was recently added to DataTables (blog post) (#403) - The default options can be set through an
itables.tomlconfiguration file, either in the current or in a parent folder (#429)
Changed
- We have changed the default value of the
htmlargument initables.sample_dfs.get_countries. It now defaults toFalse, in which case the example dataframes contains no HTML code.
Fixed
- The
showIndexargument is now ignored whendfis a Polars DataFrame (#422) - The dependencies of the streamlit component have been updated to address security issues (#420, #421, #425)
Fixed
- We have fixed an assertion error when a
table_idargument is passed toDT(#417)
Fixed
- We have fixed an issue with an index not shown when
polarswas not installed (#415)
Added
- We have added a
Framework :: Dashclassifier to highlight the fact that ITables has a component for Dash - We have added more type annotations (#390)
Fixed
- We have added a
Typing :: Typedclassifier to the package as ITables now comes with type annotations (#411) - Added type hints and an example for
pageLength(#410)
Added
Changed
- The
warn_on_undocumented_optionoption now defaults toTrueand only check the option names - We have added a new option
warn_on_unexpected_option_typethat defaults towarn_on_undocumented_optionwhentypeguard>=4.4.1is installed (Falseotherwise) - Wrapping JS function definitions in parentheses prior to JS eval is now done on the JS side.
Fixed
- We have added type hints to
itable.optionseven for the options that don't have a default value (#224) - The optional final semicolon in
styleargument is now supported again (#386) - The index of Pandas Style object is now rendered when non-trivial (#393)
- We have made the CSS files compatible with the shadow dom used by Marimo (#383)
- A workaround for the incorrect widget weight in Shiny is to use
fillable=Falsein theoutput_widget(#360) - We have fixed a Javascript error in the Jupyter widget ('t.state_change is undefined') (#407)
Added
- The ITable widget, and the ITable components for Dash and Streamlit have the same features as the
showfunction. They can show non-finite floats, bigints, Pandas Style objects and use custom JavaScript formatters (#374) - We have added type hints for the
showfunction and for the various app components. A SyntaxWarning is issued if either the argument name or type does not match whenwarn_on_undocumented_option=True(the default whentypeguard>=4.4.1is installed) - We have added more application examples, and documented how to use ITables in Marimo (#348)
Changed
- By default, the HTML content in Pandas and Polars dataframes is now escaped. Use
allow_html=Trueto display HTML content (use this option only if you trust the content of the table!) (#346) - Consistently with Pandas Style, the HTML content in Styler objects is not escaped - make sure you trust the content of the corresponding tables.
- We have updated DataTables to its latest release 2.3.0
- ITable now requires Python 3.9, due to the addition of type hints
- The
domargument (deprecated in v2.0) has been removed.
Fixed
- We have added a new option
text_in_header_can_be_selected(defaults toTrue). With that option the text in headers can be selected, giving you the option to select and copy the column names back to your Python code. - We have fixed the rendering of Polars Struct columns (#290)
Added
- ITable now has a component for Dash! You can render your Python DataFrames in your Dash application with
from itables.dash import ITable(#245)
Changed
- We have changed the default value of the
all_interactiveargument ofitables.init_notebook_modetoTrue - The ITables options can be imported and modified directly through
itables.options - We have updated
dt_for_itablestodatatables.net-dt==2.2.2anddatatables.net-select-dt==3.0.0 - We have updated the dependencies of our Jupyter widget and our of Streamlit component.
Fixed
- We have removed an erroneous assertion and added tests on the warnings issued when selected rows are not displayed ([#351])
Fixed
- We have fixed an issue with the HTML export of multiple tables in the same cell (#338)
- The dependencies of the Streamlit component have been updated (#343, #345)
Fixed
- Table footers continue to work when the notebook is exported to HTML (#331)
- The dependencies of the Streamlit component have been updated (#327, #330)
Added
- ITables is now tested with Python 3.13
Fixed
- We have fixed a HTML pop up warning when displaying Pandas Style objects in Quarto (#317)
- The dependencies of the Streamlit component have been updated (#323)
Added
- We have documented how to use the
ITablewidget in a Shiny application - We have deployed a sample Shiny app (#276)
Fixed
- We fixed an issue with the Streamlit component when
selected_rowswas not set.
Added
- ITables has a Jupyter Widget (#267). Our widget was developed and packaged using AnyWidget which I highly recommend!
- The selected rows are now available in the apps. Use either the
selected_rowsattribute of theITablewidget, the returned value of the Streamlitinteractive_tablecomponent, or the{table_id}_selected_rowsinput in Shiny (#208, #250) - ITables works offline in Shiny applications too - just add
ui.HTML(init_itables())to your application
Changed
- The
tableIdargument ofto_html_datatablehas been renamed totable_id
Fixed
- The dependencies of the Streamlit component have been updated (#320)
Fixed
- DataTables was updated to its latest version (2.1.6)
- We have added the DateTime extension, required by SearchTime when showing dates (#288)
- We have improved the function that determines whether a dark theme is being used (#294)
- We have adjusted the generation of the Polars sample dataframes to fix the CI (Polars-18130)
- The test on the Shiny app fallbacks to
ui.nav_panelwhenui.navis not available - The dependencies of the Streamlit component have been updated (#313, #315)
Fixed
- We have fixed an OverflowError (can't convert negative int to unsigned) when displaying Polars DataFrames that contain unsigned integers (#299)
Fixed
- We have improved the detection of large integers in the context of Polars DataFrames (#291)
Changed
- The default CSS contains now has
overflow:autoondiv.dt-layout-table>div. Thanks to this we now get an automatic horizontal scrolling in Jupyter, Jupyter Book and also Streamlit if the table is too wide (#282).
Fixed
- The dependencies of the Streamlit components have been updated to fix a vulnerability in
ws(Alert 1)
Fixed
- We have added an explicit
encodingargument in the calls toread_textto address an issue seen on Windows (#252). - We have adjusted the codecov settings (#280)
Changed
- We have added a default css on
dt-containerequal to{max-width:100%}. - We have updated
datatables.net-dtto2.0.8, and included the column visibility button in thedt_for_itablespackage (#284)
Added
- ITables works with Streamlit (#270)
Changed
- ITables now uses the
srclayout (#246) - many thanks to Mahendra Paipuri for his help on this topic! - We have updated
dt_for_itables' dependencies todatatables.net-dt==2.0.7anddatatables.net-select-dt==2.0.2(#273) - We have updated the pre-commit hooks used in the project (#268)
Added
- We have added a logo for ITables (#257)
- The loading message gives more information, including the version of ITables and where DataTables is loaded from (#258)
Changed
- We have updated
DataTablesto2.0.5and its extensions to their latest version (#260) maxBytescan now be a string. Its default value remains unchanged at64KB(#239)
Fixed
- We have improve the compatibility with dark themes (#255)
- We now enforce non-sparse index when displaying Pandas Style objects with a multiindex (#254)
- Export buttons are shown when using
show(df, buttons=...)on a Pandas Style object (#259) - We have fixed a side effect when using
logging(#265)
Added
- The CSV, Excel and Print buttons are now included (#50, #155)
- We have included a few other extensions like SearchBuilder and SearchPanes and documented how to add more (#178, #207, #208, #231)
- ITables is now tested with Python 3.12
Changed
- ITables uses the latest version
2.0.2ofDataTables(#121) - Large Python integers are now mapped to JavaScript
BigInt(#172) - ITables is build using
hatchandpyproject.toml
Fixed
Added
- We have added a check to make sure any
tableIdprovided by the user is valid (#233)
Added
- ITables works well with Quarto. We have added Quarto examples to the documentation. We set
data-quarto-disable-processing="true"on the tables that are generated withuse_to_html=Falseand thus can't be processed by Quarto (#179)
Fixed
- ITables works when you duplicate a notebook (#222)
- We use
df.isetitem(i, ...)rather thandf.iloc[:,i] = ...to avoid a warning with Pandas 2.2.0 (#223)
Changed
- We have changed how datatables.net is loaded. This is expected to improve the VSCode experience (#216)
- We have removed legacy Python 2 code.
Fixed
- Complex table footers are now in the correct order (#219)
- We have adjusted the test suite for
pandas==2.2.0(#223, pandas-57229, pandas-55080)
Changed
- HTML in table columns is supported (#213)
Fixed
- We have removed an indirect dependency on
jinja2caused by the Pandas style objects (#202)
Fixed
- We have fixed an issue when rendering Pandas style objects in Google Colab (#199)
Added
- We have added support for Pandas style (#194)
Fixed
- We do not generate timedeltas in the sample dataframes when using
pandas==2.1as this fails (pandas-55080)
Fixed
- Fixed an OverflowError when displaying Polar tables containing unsigned integers (#192)
Changed
- We have refactored the GitHub Action workflows. Python 2 was removed since it is not supported anymore.
Fixed
- We fixed an interaction issue with other ui elements in Shiny apps - use
from itables.shiny import DT(#181) - We fixed the rendering of some empty dataframes
Fixed
- Integers that are too big for Javascript are converted to str (#152)
- If a downsampling occurs, the downsampling message is displayed even if the table only has a few rows
Added
- We have added a CI configuration where we test
itablesagainstpandasin pre-release versions
Fixed
- Empty Polars DataFrame are now rendered correctly (#167)
Fixed
- We have addressed the
window.initializeDataTableis not a function error when a notebook is reloaded (#160, #163). Many thanks again to François Wouts for providing the right fix!
Added
- Polars DataFrames are supported (#159)
- We have added an example to show how to include images in tables (#158)
- We have added links and images (flags from https://flagpedia.net) to the sample countries df (#158).
Changed
- We have updated the pre-commit hooks
Added
- We have added a new
JavascriptCodeclass to encapsulate JS Code. This will let the user set JS values for some options likecolumnDefs.render(#154).
Fixed
- Fixed an issue when
lengthMenuis a 2D array (#151)
Changed
- We make sure that no argument passed to
showis equal toNone(for all tested options, passingNoneresults in a datatable that never loads) - Running the test collection will not update the CSV files used for testing anymore
Fixed
- We have added
numpyto the dependencies,pytzis an optional dependency (used in the sample dataframes only), and we do not depend onsixanymore (#149) The build time dependenciespathlibandrequestsare listed inpyproject.toml(since #123,itables==1.4.0)
Changed
- When a table is made of only a few rows, we display just the table (not the search box, pagination control, etc)
Fixed
- We make sure that the table content has the same number of columns as the header (#141)
- We have updated the documentation on column widths (#145)
Fixed
- We have added
setuptools.build_metaas the build backend inpyproject.toml(#142) - We have fixed a typo in
itables.options.style
Changed
- We have updated the development status of the project to Production/Stable
Fixed
- We have improved the support for dark themes by using the CSS from datatables.net in version 1.13.1 (#103)
- We have fixed a compatibility issue with old versions of pandas
- We have added a test to make sure that timezones are preserved
requestswas added as a build dependency (#123)- and the
flake8pre-commit hook was fixed (#124) - thanks to Anselm Hahn for these two contributions! - Duplicated column and index names are supported (#134)
Added
- The examples in the documentation are now executed as part of the test suite to increase the coverage.
- We have added a new
captionargument to theshowfunction to make it easier to add captions on tables.
Changed
- We have changed the default table to
style = "table-layout:auto;width:auto;margin:auto"to fix an issue on the width of index columns (defaultstylewaswidth:autopreviously) (#130) - The default classes applied to datatables are now
["display", "nowrap"] - We have changed the default order to
order = []i.e. we don't sort anymore the table, even when the index is monotonic, to fix an issue in the order of categories (#135) - We have set an explicit
maxRows = 0and also increasedmaxColumnsto200(instead of Pandas' default at 20).
Fixed
- We use
pandas.io.formats.format.format_arrayto format non-trivial dtypes (as initables<=1.3.1) (#112) - The downsampling of large tables is faster. We have also added a new function
generate_random_dfto generate large tables on demand (#113) - We don't raise a warning anymore when a table is downsampled. Instead, we add this information to the table summary (#114)
Added
- We have added support for Python 2 (#115).
Fixed
- We have removed
scrollX = Truewhich was causing issues with non-wide tables (#110). Instead, we now usestyle = "width:auto".
Changed
- We have added
scrollX = Trueto the default options to make the rendering of wide tables more similar to Pandas.
Fixed
- We have reimplemented the function that encodes the Pandas dataframes to JSON
to avoid triggering FutureWarnings when using
pandas>=1.5(#107).
Added
- The
showmethod has a newcssargument (defaults toitables.options.css) (#104).
Changed
- The order of rows is preserved by default (unless you explicitly pass an
orderparameter) (#99).
Fixed
- Nullable types (bool, int) are now supported (#98)
Added
- New
to_html_datatablefunction to export a DataFrame to an HTML div (#88) - We have added examples on how to use
itablesin Shiny for Python (#86)
Fixed
- Tables with duplicated column names are now supported, thanks to Antonio Commisso's fix (#89)
Changed
- Tables with many rows are preferentially downsampled on rows, while tables with many columns are preferentially downsampled on columns (#84)
Fixed
- Added missing
column_filterspackage data.
Added
itables.optionsand theshowfunction have a newcolumn_filtersargument to display individual column search boxes (#69)- We have documented DataTables'
domoption. - We have introduced a new class
JavascriptFunctionto limit the evaluation of Javascript function to selected ones. - The documentation is formatted with
blackthanks to a Jupytext & Black pre-commit hook.
Added
- ITables works offline! (#8, #70). Marc would like to thank Allan Jardine, the author of the datatables library, and François Wouts for their precious help on the subject.
Changed
- ITables uses the ESM version 1.12.1 of datatables.net
Added
- Additional
tagslike e.g. captions are supported (#10).
Changed
- We have removed the default column width at 70 pixels (#61, #62, #66)
- We now use
pyupgradein our pre-commit hooks
Fixed
- We have improved the rendering of multiindex columns (#63)
Changed
- The
itablesdocumentation now uses Jupyter Book (#56) - We have added a new
styleoption initables.optionsand inshow, with a default value equal tomax-width:100%.
Fixed
- Add 'require_config.js' to the pip package (#48)
Changed
- When a JS function is created on the Python side, we export it as-is (without quotes) in the HTML file and don't use JS eval anymore.
Fixed
- Fix the HTML output when
eval_functions=True - Display "Loading..." under the table header until the table is displayed with datatables.net
init_notebook_mode(all_interactive=False)restores the original Pandas HTML representation.
Fixed
- Long column names don't overlap anymore (#28)
rFixed
- Now
itablesalso works in Jupyter Lab, Colab, VS Code and PyCharm (#3, #4, #26, #40), as we load thedatatables.netlibrary with an ES import whenrequire.jsis not available. Many thanks to François Wouts for his precious help!
Changed
- The
showfunction (anditables.options) has a new argumenteval_functions. When set toTrue, the nested strings passed todatatables.netthat start withfunctionare converted to Javascript functions. - The HTML code for the datatables.net representation of the table is generated with an HTML template.
- We use f-strings and thus require Python >= 3.6
Fixed
- We fixed an issue (
jquerynot found) with the HTML export when usingnbconvert>=6.0(#21) - We documented how to change the default ordering of rows - with the
orderoption (#30) - We documented how to load
requirein Jupyter Lab (#3)
Changed
- The main branch for the project is
mainrather thanmaster - Updated
datatablesto 1.11.3 andjqueryto 3.5.1
Fixed
itablesnow has an explicitinit_notebook_modefunction, which inserts the datatables.net library in the notebook. Useinit_notebook_mode(all_interactive=True)to display all the pandas object as interactive tables. This fixes (#6) and (#17).
Changed
itablesuses GitHub Actions for the CI.
Added
itablesis tested with Python 3.9 as well.
Fixed
- Pandas'
display.max_columnscan beNone, by Arthur Deygin (#14)
Added
- Animated screenshot in README
Fixed
- Add IPython to setup.py install_requires, by Jon Shao (#9)
Added
- Large tables are downsampled (#2)
Changed
- Javascript code moved to Javascript files
Fixed
- Tables with many columns are now well rendered (#5)
Initial release