A quick post to note a couple of tricks for generating simple interactive controls that let you manipulate the display of a pandas dataframe in a Jupyter notebook using IPython widgets.
Suppose we have a dataframe df, and we want to limit the display of rows to just the rows for which the value in a particular column matches a particular categorical value. We can create a drop down list containing the distinct/unique values contained within the column, and use this to control the display of the dataframe rows. Adding an “All” option allows us to display all the rows:
import ipywidgets as widgets from ipywidgets import interactive items = ['All']+sorted(df['Asset Type Description'].unique().tolist()) def view(x=''): if x=='All': return df return df[df['Asset Type Description']==x] w = widgets.Select(options=items) interactive(view, x=w)
We can also create multiple controller widgets and bind them into a single interactive display function. For example, we might have one control to filter rows according to the value contained within a particular column, and another widget limiting how many rows are displayed by creating two widgets and accessing them via an interactive ipywidgets construction call:
def view2(x='',y=3): if x=='All': return df.head(y) return df[df['Asset Type Description']==x].head(y) a_slider = widgets.IntSlider(min=0, max=15, step=1, value=5) b_select = widgets.Select(options=items) widgets.interactive(view2,y=a_slider,x=b_select)
The attributes of a widget can also be set dynamically, even to the effect of setting the attribute values of one widget as some ultimate function of the value returned from another widget. For example, suppose we want to limit the rows displayed to range from 0 to the total number of rows associated with a particular “subselected” dataframe. Using the .observe() method applied to a widget, we can call a function whenever that widget is interacted with that acts on its new value:
c_slider = widgets.IntSlider(min=0, max=len(df), step=1, value=5) d_select = widgets.Select(options=items) def update_c_range(*args): if d_select.value=='All': c_slider.max = len(df) else: c_slider.max = len(df[df['Asset Type Description']==d_select.value]) d_select.observe(update_c_range, 'value') def view3(x='',y=3): if x=='All': return df.head(y) return df[df['Asset Type Description']==x].head(y) widgets.interactive(view3,y=c_slider,x=d_select)
4 thoughts on “Simple Interactive View Controls for pandas DataFrames Using IPython Widgets in Jupyter Notebooks”
Very nice. Has anyone been able to do a similar thing but with the exclusion of columns or the inclusion/exclusion of rows? This extra step would be excellent!
@Joshua Not sure what you mean? Could you give an example?
After updating to ipywidgets 6.0, this does not seem to work with interactive, but it does work with interact.
@David Thanks for the tip off… will check…
Comments are closed.